Pattern Repository et Unit of Work - Détail du Pattern Unit of Work

Apprenez à regrouper vos opérations dans une transaction unique avec le pattern Unit of Work, accompagné d’une implémentation pratique.

Sommaire

Cet article fait partie d'une série de plusieurs articles sur les patterns Repository et Unit of Work :

Pattern Unit of Work : Gérer les transactions

Le Pattern Unit of Work est conçu pour regrouper plusieurs opérations dans une seule transaction cohérente. Il garantit que toutes les modifications sont effectuées ou annulées en cas d’échec.

Exemple d’interface Unit of Work

public interface IUnitOfWork : IDisposable
{
    IRepository<T> Repository<T>() where T : class;
    Task<int> SaveChangesAsync();
}

Implémentation de Unit of Work

Voici une implémentation de base :

public class UnitOfWork : IUnitOfWork
{
    private readonly DbContext _context;
    private readonly Dictionary<string, object> _repositories = new();

    public UnitOfWork(DbContext context)
    {
        _context = context;
    }

    public IRepository<T> Repository<T>() where T : class
    {
        var typeName = typeof(T).Name;

        if (!_repositories.ContainsKey(typeName))
        {
            var repositoryInstance = new Repository<T>(_context);
            _repositories[typeName] = repositoryInstance;
        }

        return (IRepository<T>)_repositories[typeName];
    }

    public async Task<int> SaveChangesAsync() => await _context.SaveChangesAsync();

    public void Dispose() => _context.Dispose();
}

Ce pattern permet d’isoler la gestion des transactions et de coordonner les repositories dans une unité unique.

A suivre : Compatibilité et limitations avec les microservices