Principes SOLID simplifiés (5/5): Inversion De Dépendance

Principes SOLID simplifiés (5/5): Inversion De Dépendance
Cliquez ici pour voir la table des matières

Introduction

Dans mon précédent article j’ai expliqué le quatrième principe SOLID (Ségrégation d’interface).

N’hésitez pas a découvrir les autres principes SOLID dans cette série d’articles:

Aujourd’hui je vous propose une explication pour le cinquième principe S.O.L.I.D, c’est le principe «Inversion De Dépendance» (Dependency Inversion), ce principe est basé sur les affirmations suivantes:

  • Les modules de haut niveau ne devraient pas dépendre des modules de bas niveau, tous deux devraient dépendre d’abstraction.
  • Les abstractions ne devraient pas dépendre de détails, ce sont les détails qui devraient dépendre des abstractions.

On comprend mieux avec un exemple!

Un mauvais exemple

public sealed class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public sealed class CustomerRepository
{
    public CustomerRepository(string dbConnectionString)
    {
        // Some implementation here
    }
    public void AddCustomer(Customer customer)
    {
        // Some implementation here (database)
    }
}
public sealed class CustomerService
{
    private CustomerRepository _customerRepository = new CustomerRepository("dbConnectionString");

    public void Add(Customer customer)
    {
        _customerRepository.AddCustomer(customer);
    }

Le code est incorrect car la classe CustomerService dépend de la classe CustomerRepository et sait également comment l’instancier.

Un bon exemple

public sealed class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public interface ICustomerRepository
{
    void AddCustomer(Customer customer);
}
public sealed class CustomerRepository : ICustomerRepository
{
    public CustomerRepository(string dbConnectionString)
    {
        // Some implementation here
    }

    public void AddCustomer(Customer customer)
    {
        // Some implementation here (database)
    }
}
public sealed class CustomerService
{
    private ICustomerRepository CustomerRepository { get; }
    public CustomerService(ICustomerRepository customerRepository)
    {
        CustomerRepository = customerRepository;
    }

    public void AddCustomer(Customer customer)
    {
        CustomerRepository.Add(customer);
    }
}

Le code est correct car la classe CustomerService ne dépend que de l’interface ICustomerRepository, elle ne connaît pas l’implémentation ni comment l’instancier.

Si vous avez aimé cet article, n’hésitez pas à le partager !