Le Unit of Work est un design pattern très utilisé en architecture d'applications (notamment avec Entity Framework et d'autres ORM) pour gérer les transactions de manière cohérente.
🧩 Définition simple
Unit of Work (UoW) agit comme un coordinateur qui regroupe toutes les opérations de modification d'une base de données effectuées dans une unité logique de travail, et les exécute toutes en une seule transaction.
🎯 Objectif principal
-
Regrouper plusieurs opérations (insert, update, delete) sur différents objets.
-
Ne les appliquer que si tout réussit (comme un
commit
dans une transaction SQL). -
Centraliser les appels aux
Repository
.
📦 Métaphore simple :
Imagine que tu remplis un chariot de supermarché (ajouter, retirer des articles).
Tu ne paies (commit) qu’une fois à la caisse. Si tu annules (rollback) avant, rien n’est facturé.
✅ Exemple C# avec interface IUnitOfWork
Supposons un projet avec ProductRepository
et OrderRepository
.
1. Interface IUnitOfWork
public interface IUnitOfWork : IDisposable
{
IProductRepository Products { get; }
IOrderRepository Orders { get; }
int Complete(); // équivalent à "SaveChanges"
}
2. Implémentation avec Entity Framework
public class UnitOfWork : IUnitOfWork
{
private readonly AppDbContext _context;
public IProductRepository Products { get; private set; }
public IOrderRepository Orders { get; private set; }
public UnitOfWork(AppDbContext context)
{
_context = context;
Products = new ProductRepository(_context);
Orders = new OrderRepository(_context);
}
public int Complete()
{
return _context.SaveChanges(); // tout est enregistré ici
}
public void Dispose()
{
_context.Dispose();
}
}
3. Utilisation dans un service
public class OrderService
{
private readonly IUnitOfWork _unitOfWork;
public OrderService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public void PlaceOrder(Order order)
{
_unitOfWork.Orders.Add(order);
_unitOfWork.Products.UpdateStock(order.ProductId, -order.Quantity);
_unitOfWork.Complete(); // une seule transaction
}
}
🧠 Différence entre Repository et Unit of Work
Repository | Unit of Work |
---|---|
Gère une seule entité | Coordonne plusieurs repositories |
Contient la logique de lecture/écriture | Gère les transactions |
Peut être utilisé seul | Utilisé pour les opérations complexes |
Aucun commentaire:
Enregistrer un commentaire