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 ?