2013-04-28 81 views
5

我用這個代碼從企業庫初始化RetryManager:從EnterpriseLibraryContainer初始化RetryManager不工作

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

現在我更新企業庫NuGet包到最新版本並沒有EnterpriseLibraryContainer了。

如何使用新的企業管理器初始化RetryManager?它必須是線程安全的,因爲我的代碼是在Web服務器上執行的。

+0

這確實令人沮喪。我試圖學會使用日誌塊,並有相同的問題。希望MS能很快解決這個問題。 – 2013-05-01 17:14:57

回答

3

我解決這樣說:

刪除所有舊的NuGet包,只安裝這兩個:

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

在一次應用程序添加以下代碼:

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

然後使用新的連接來自微軟的課程:

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

我也從Web.Config中刪除了所有的配置,因爲它現在在我的代碼中。

1

不能再使用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」,它們已被重命名。供參考請看here

在代碼級別,你會需要這樣的東西:

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; 

希望這有助於!