Initialize RetryManager from EnterpriseLibraryContainer not working

I used this code to initialize RetryManager from the Enterprise Library:

using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure;
using Microsoft.Practices.TransientFaultHandling;

...

var manager = EnterpriseLibraryContainer.Current.GetInstance<RetryManager>();
return manager.GetDefaultSqlConnectionRetryPolicy();

Now I have updated the NuGet Enterprise Library package to the latest version and EnterpriseLibraryContainer no longer exists.

How to initialize RetryManager using the new Enterprise Manager? It must be thread safe because my code is running on a web server.

+5
source share
2 answers

I solved it like this:

Remove all old NuGet packages and install only those two:

<package id="EnterpriseLibrary.TransientFaultHandling" version="6.0.1304.0" targetFramework="net45" />
<package id="EnterpriseLibrary.TransientFaultHandling.Data" version="6.0.1304.0" targetFramework="net45" />

Add this code once to the application:

var strategy = new FixedInterval("fixed", 10, TimeSpan.FromSeconds(3));
var strategies = new List<RetryStrategy> {strategy};
var manager = new RetryManager(strategies, "fixed");
RetryManager.SetDefault(manager);

Then use the new connection class from Microsoft:

using (var connection = new ReliableSqlConnection(ConnectionString))
{
    connection.Open();
    ...
    command.ExecuteNonQueryWithRetry();
}

I also deleted the entire configuration from Web.Config, because now it is in my code.

+3
source

EnterpriseLibraryContainer , , .

:

nuget EnterpriseLibrary.TransientFaultHandling.Configuration

web/app.config :

<configSections>
    <section name="RetryPolicyConfiguration" type="Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.Configuration.RetryPolicyConfigurationSettings, Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.Configuration, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
    <section name="typeRegistrationProvidersConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.TypeRegistrationProvidersConfigurationSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>

<typeRegistrationProvidersConfiguration>
    <clear />
    <add sectionName="RetryPolicyConfiguration" name="RetryPolicyConfiguration" />
</typeRegistrationProvidersConfiguration>

<RetryPolicyConfiguration defaultRetryStrategy="Fixed Interval Retry Strategy"
                        defaultSqlConnectionRetryStrategy="Incremental Retry Strategy">
    <incremental name="Incremental Retry Strategy" retryIncrement="00:00:01" initialInterval="00:00:01" maxRetryCount="10" />
    <fixedInterval name="Fixed Interval Retry Strategy" retryInterval="00:00:01" maxRetryCount="10" />
    <exponentialBackoff name="Backoff Retry Strategy" minBackoff="00:00:01" maxBackoff="00:00:30"
                    deltaBackoff="00:00:10" maxRetryCount="10" firstFastRetry="false"/>
</RetryPolicyConfiguration>

, "retryInterval" "fastFirstRetry", , "initialInterval" "firstFastRetry", . .

- :

RetryPolicy retryPolicy;

try
{
    retryPolicy = RetryPolicyFactory.GetDefaultSqlConnectionRetryPolicy();
}
catch (NullReferenceException)
{
    throw new Exception("Unable to read transient fault handling behaviour from config, config section for TransientFaultHandling seems to be missing.");
}

return retryPolicy;

, !

+1

All Articles