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 :
- Introduction générale et utilité des patterns dans les projets d'entreprise
- Détail du Pattern Repository
- Détail du Pattern Unit of Work
- Compatibilité et limitations avec les microservices
- Exemple concret : Utilisation conjointe dans une plateforme e-commerce
- Conclusion et retour d'expérience
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