Использование блока Entity Framework и блока обработки ошибок с переходными процессами без лазури

У меня есть несколько приложений, которые полагаются на репозиторий с использованием EF 4. Иногда операция SQL завершится неудачей только потому, что (например, время ожидания, неудачное соединение и т.д.).

Я хочу использовать блок приложений обработки переходных ошибок, но я НЕ использую Azure. Похоже, что существует множество информации для сценариев Azure, но нет информации об использовании подхода "barebones". Я беспокоюсь, что если я использую стратегии обнаружения Azure, это просто не сработает.

Кто-нибудь знает, где я могу найти информацию о том, как наилучшим образом использовать это?

1 ответ

Мне удалось начать работу, посмотрев здесь: 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);
 };
</entityframeworktransienterrordetectionstrategy>

Типичный метод репозитория:

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

licensed under cc by-sa 3.0 with attribution.