mercredi 5 avril 2023

Unit of Work

 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

Unit of Work Lượt xem: