La mise en œuvre de logique de nouvelle tentative de blocage des exceptions

J'ai mis en place un référentiel générique et je me demandais si il n'y est une façon intelligente de mettre en œuvre une logique de nouvelle tentative en cas d'impasse exception?

La démarche doit être la même pour tous référentiel de méthodes. Donc, il y a de toute façon je peux éviter d'écrire 'try/catch - méthode call de nouveau avec retry-comte", dans chaque méthode unique?

Tout suggetsion sont les bienvenus.

Un peu de mon code de Référentiel:

public class GenericRepository : IRepository
{
    private ObjectContext _context;

    public List<TEntity> ExecuteStoreQuery<TEntity>(string commandText, params object[] parameters) where TEntity : class
    {
        List<TEntity> myList = new List<TEntity>();

        var groupData = _context.ExecuteStoreQuery<TEntity>(commandText, parameters);

        return myList;
    }


    public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
    {          
        var entityName = GetEntityName<TEntity>();
        return _context.CreateQuery<TEntity>(entityName);
    }

    public IEnumerable<TEntity> GetAll<TEntity>() where TEntity : class
    {
        return GetQuery<TEntity>().AsEnumerable();
    }

EDIT:

1.Solution:

Légèrement modifié à partir de chris.maison.00's solution

 public static T DeadlockRetryHelper<T>(Func<T> repositoryMethod, int maxRetries)
    {
        var retryCount = 0;

        while (retryCount < maxRetries)
        {
            try
            {
                return repositoryMethod();
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                if (ex.Number == 1205)//Deadlock                         
                    retryCount++;
                else
                    throw;                   
            }
        }
        return default(T);
    }

Et vous l'appeler comme ceci:

    public TEntity FirstOrDefault<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
    {
        return RetryUtility.DeadlockRetryHelper<TEntity>( () =>p_FirstOrDefault<TEntity>(predicate), 3);
    }

    protected TEntity p_FirstOrDefault<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
    {
        return GetQuery<TEntity>().FirstOrDefault<TEntity>(predicate);
    }
  • Quoi de mal avec une instruction try?
  • Je pense que l'OP veut éviter de répéter les blocs try...catch dans chaque pensions de méthode.
  • Assurer votre référentiel peut gérer les tentatives de blocage pourrait être difficile. Même si vous consolidez les appels vers le référentiel, chaque respository fonction devra encore être testé.
InformationsquelleAutor user1638662 | 2012-10-31