2013-04-28 19 views
5

Użyłem tego kodu, aby zainicjować RetryManager z Enterprise Library:Initialize RetryManager z EnterpriseLibraryContainer nie działa

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(); 

Teraz uaktualniony pakiet Enterprise Library Nuget do najnowszej wersji i nie ma EnterpriseLibraryContainer więcej.

Jak zainicjować RetryManager za pomocą nowego Enterprise Manager? Musi być bezpieczny dla wątków, ponieważ mój kod jest wykonywany na serwerze sieciowym.

+0

To naprawdę frustrujące. Próbuję nauczyć się korzystać z bloku logowania i mam ten sam problem. Mam nadzieję, że MS wkrótce to naprawi. –

Odpowiedz

3

postanowiłem to w ten sposób:

Usuń wszystkie stare pakiety Nuget i zainstalować tylko te dwa:

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

Dodaj ten kod raz w aplikacji:

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

Następnie użyj nowego połączenia klasa z microsoft:

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

Usunąłem też całą konfigurację z Web.Config, ponieważ jest teraz w moim kodzie.

1

Nie można już korzystać z EnterpriseLibraryContainer, spójrz poniżej, czy to pomaga.

Opcja config jest nadal dostępny:

Zasadniczo trzeba pakiet Nuget EnterpriseLibrary.TransientFaultHandling.Configuration

Wtedy trzeba by zaktualizować internetowej/app.config do czegoś podobnego:

<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> 

Jeśli otrzymasz błędy środowiska wykonawczego, takie jak atrybut "retryInterval" lub "fastFirstRetry", nie jest to rozpoznawany atrybut, spróbuj zamiast tego "initialInterval" i "firstFastRetry", zostały one zmienione. Dla odniesienia wygląd here.

Na poziomie kodu będzie trzeba coś takiego:

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; 

nadzieję, że to pomaga!