Aller au contenu principal
Nicolas Cousin Tech SolutionsNicolas Cousin Tech Solutions
Module 3 sur 6

Détail du Pattern 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();
}

Résultat : la gestion des transactions reste isolée, et tous les repositories sont coordonnés depuis un seul point d'entrée.

Vérifiez votre compréhension

Quel est le rôle principal du pattern Unit of Work ?

Dans l'implémentation du module, à quoi sert le dictionnaire _repositories ?