6

我使用此代码从 Enterprise Library 初始化 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();

现在我将 Enterprise Library NuGet 包更新到最新版本,不再有 EnterpriseLibraryContainer。

如何使用新的 Enterprise Manager 初始化 RetryManager?它必须是线程安全的,因为我的代码是在 Web 服务器上执行的。

4

2 回答 2

4

我是这样解决的:

删除所有旧的 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 中删除了所有配置,因为它现在在我的代码中。

于 2013-04-28T18:29:40.713 回答
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”,它们已被重命名。供参考看这里

在代码级别上,您需要以下内容:

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;

希望这可以帮助!

于 2013-05-07T08:54:11.490 回答