在没有Azure的情况下使用实体框架和瞬态故障处理块

时间:2013-05-09 18:28:16

标签: .net entity-framework

我有几个依赖于使用EF 4的存储库的应用程序。有时,SQL操作会因为(即超时,连接失败等)而失败。

我想使用瞬态故障处理应用程序块,但我不使用Azure。对于Azure方案,似乎有大量信息,但没有关于使用“准系统”方法的信息。我担心,如果我使用Azure检测策略,它将无法正常工作。

任何人都知道我在哪里可以找到有关如何最好地使用它的信息?

1 个答案:

答案 0 :(得分:2)

我可以通过查看此处开始: http://hmadrigal.wordpress.com/2012/04/23/automatic-retries-using-the-transient-fault-handling-from-enterprise-libraries-entlib/

您只需编写自己的检测策略类。就我而言,它看起来像这样:

public class EntityFrameworkTransientErrorDetectionStrategy : ITransientErrorDetectionStrategy
{
    #region ITransientErrorDetectionStrategy Members

    public bool IsTransient(Exception ex)
    {
        if (ex is SqlException)
        {
            return true;
        }
        else
            return false;
    }

    #endregion
}

在我的存储库构造函数中,我有:

_retryStrategy = new FixedInterval(_retryLimit, new TimeSpan(0, 0, 0, 0, 500));
        _retryPolicy = new RetryPolicy<EntityFrameworkTransientErrorDetectionStrategy>(_retryStrategy);     // use our custom detection strategy

        _retryPolicy.Retrying += (sender, args) =>
            {
                // Log any retries as warnings
                _logger.WarnFormat("Retry {0} of {1} due to exception: {2}", args.CurrentRetryCount, _retryLimit, args.LastException);
            };

典型的存储库方法:

public override HarvesterDomain.Source SelectSource(Guid id)
    {
        HarvesterDomain.Source source = null;
        _retryPolicy.ExecuteAction(() =>
            {
                var contextSource = _context.Sources.Where(s => s.Id == id).FirstOrDefault();

                if (contextSource != null)
                    source = contextSource.ToHarvesterDomainSource();
            });
        return source;
    }