POO Avancée & Architecture Logicielle avec C#

💉 Module 4

Injection de Dépendances & Inversion de Contrôle

Objectif: comprendre pourquoi le conteneur natif .NET est devenu central dans toute architecture moderne.

POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

📝 Changelog — V0.0.1

  • Création du deck DI / IoC sur les enregistrements de services, les durées de vie et la composition racine.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Vue du conteneur et des durées de vie

POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Le rôle du conteneur

  • Résoudre les dépendances à partir d'une composition centrale.
  • Contrôler la durée de vie des objets.
  • Isoler les détails techniques de la logique métier.
  • Faciliter les tests par remplacement d'implémentation.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Enregistrement minimal

var services = new ServiceCollection();

services.AddSingleton<IClock, SystemClock>();
services.AddScoped<IReservationRepository, EfReservationRepository>();
services.AddTransient<ReserveResourceHandler>();

var provider = services.BuildServiceProvider();
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Comprendre les durées de vie

  • Singleton: partagé, durable, attention à l'état mutable.
  • Scoped: une instance par requête ou par portée logique.
  • Transient: créé à chaque résolution.

Règle utile: un singleton ne doit pas capturer une dépendance scoped.

POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Injection par constructeur

public sealed class ReserveResourceHandler(
    IReservationRepository repository,
    IUnitOfWork unitOfWork,
    IClock clock)
{
    public async Task HandleAsync(ReserveResource command, CancellationToken ct)
    {
        var reservation = Reservation.Create(command.ResourceId, command.Start, command.End, clock.UtcNow);
        await repository.AddAsync(reservation, ct);
        await unitOfWork.SaveChangesAsync(ct);
    }
}
  • Les dépendances deviennent visibles.
  • Le handler reste testable sans infrastructure réelle.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Application vs infrastructure

  • L'application dépend d'interfaces du domaine.
  • L'infrastructure fournit la base de données, l'email, la messagerie, les clients HTTP.
  • La composition racine assemble les deux au démarrage.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Pièges fréquents

  • Service locator caché dans le code métier.
  • Trop d'abstractions pour de simples helpers internes.
  • Durées de vie incohérentes.
  • Conteneur vu comme une solution à une mauvaise modélisation.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Résultat attendu

  • Un graphe de dépendances explicite.
  • Des services unit-testables.
  • Un couplage plus faible entre les couches.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com