2013-04-28 112 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; 

希望这有助于!