mercredi 1 juin 2022

Repository Pattern

 Le Repository Pattern (ou patron de dépôt en français) est un design pattern très utilisé en C# et en architecture d'applications (ex. ASP.NET) pour séparer la logique d'accès aux données de la logique métier.


📦 Définition simple

Le Repository Pattern agit comme une interface entre l’application et la source de données. Il centralise toute la logique de lecture/écriture afin que les composants de l’application (ex. contrôleurs, services) n’aient pas à interagir directement avec la base de données.


🎯 Pourquoi l'utiliser ?

Séparation des responsabilités
Réutilisabilité du code d'accès aux données
Testabilité (plus facile à mocker pendant les tests)
Centralisation de la logique de requête


🧩 Exemple en C# (simplifié)

Imaginons une entité Product.

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

1. Interface IProductRepository

public interface IProductRepository
{
    Product GetById(int id);
    IEnumerable<Product> GetAll();
    void Add(Product product);
    void Delete(int id);
}

2. Implémentation concrète

public class ProductRepository : IProductRepository
{
    private readonly List<Product> _products = new List<Product>();

    public Product GetById(int id) => _products.FirstOrDefault(p => p.Id == id);
    public IEnumerable<Product> GetAll() => _products;
    public void Add(Product product) => _products.Add(product);
    public void Delete(int id)
    {
        var product = GetById(id);
        if (product != null)
            _products.Remove(product);
    }
}

3. Utilisation dans le service

public class ProductService
{
    private readonly IProductRepository _repository;

    public ProductService(IProductRepository repository)
    {
        _repository = repository;
    }

    public void CreateProduct(string name)
    {
        var product = new Product { Id = new Random().Next(1, 1000), Name = name };
        _repository.Add(product);
    }
}

🧪 Bonus : pourquoi c’est utile pour les tests ?

Dans un test unitaire, on peut facilement simuler le repository :

var mockRepo = new Mock<IProductRepository>();
mockRepo.Setup(r => r.GetAll()).Returns(new List<Product> { new Product { Name = "Test" } });

var service = new ProductService(mockRepo.Object);

🔁 Variante avec Entity Framework

Quand on utilise Entity Framework, le DbContext agit déjà comme un repository, donc certains projets modernes préfèrent ne pas rajouter une couche supplémentaire sauf si elle est justifiée.



Aucun commentaire:

Enregistrer un commentaire

Repository Pattern Lượt xem: