Conteneur d'injection de dépendances pour C# (.NET) : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Conteneur d'injection de dépendances pour C# (.NET) : guide complet

\n\n

L'injection de dépendances (DI) est l'un des modèles de conception clés dans le développement moderne en C# et .NET. Elle permet de créer des applications faiblement couplées, testables et faciles à maintenir. Dans cet article, nous examinerons en détail ce qu'est un conteneur d'injection de dépendances, comment l'utiliser dans .NET, et nous fournirons des exemples de code pratiques.

\n\n

Qu'est-ce que l'injection de dépendances ?

\n\n

L'injection de dépendances est un modèle dans lequel un objet reçoit ses dépendances de l'extérieur, plutôt que de les créer lui-même. Cela permet de :

\n
    \n
  • Réduire le couplage entre les composants
  • \n
  • Simplifier les tests (possibilité de remplacer les dépendances par des mocks)
  • \n
  • Améliorer la flexibilité et la réutilisabilité du code
  • \n
  • Centraliser la gestion du cycle de vie des objets
  • \n
\n\n

Qu'est-ce qu'un conteneur DI ?

\n\n

Un conteneur DI (ou conteneur IoC) est une bibliothèque qui automatise le processus d'injection de dépendances. Il prend en charge la création des objets et la gestion de leur durée de vie. Dans .NET, le conteneur DI principal est Microsoft.Extensions.DependencyInjection, qui est intégré à ASP.NET Core et peut être utilisé dans toute application .NET.

\n\n

Concepts de base du conteneur DI

\n\n

Le conteneur DI fonctionne avec les concepts suivants :

\n
    \n
  • Enregistrement des services — le processus d'ajout des types et de leurs implémentations dans le conteneur
  • \n
  • Résolution des dépendances — la création automatique d'objets avec leurs dépendances
  • \n
  • Durée de vie des services — détermine combien de temps un objet existe (Transient, Scoped, Singleton)
  • \n
\n\n

Configuration du conteneur DI dans .NET

\n\n

Pour commencer à utiliser le conteneur DI, vous devez installer le package Microsoft.Extensions.DependencyInjection. Cela peut être fait via NuGet :

\n\n
dotnet add package Microsoft.Extensions.DependencyInjection
\n\n

Après l'installation, une instance de ServiceCollection est créée, dans laquelle toutes les dépendances sont enregistrées :

\n\n
using Microsoft.Extensions.DependencyInjection;\n\n// Créer une collection de services\nvar services = new ServiceCollection();\n\n// Enregistrer les services\nservices.AddTransient<ILogger, ConsoleLogger>();\nservices.AddScoped<IUserRepository, UserRepository>();\nservices.AddSingleton<IConfiguration, AppConfiguration>();\n\n// Construire le fournisseur de services\nvar serviceProvider = services.BuildServiceProvider();
\n\n

Exemple d'utilisation du conteneur DI

\n\n

Considérons un exemple concret : une application de gestion des utilisateurs. Créons des interfaces et leurs implémentations :

\n\n
public interface IUserRepository\n{\n    User GetUser(int id);\n}\n\npublic interface IEmailService\n{\n    void SendEmail(string to, string subject);\n}\n\npublic class UserRepository : IUserRepository\n{\n    public User GetUser(int id)\n    {\n        // Logique pour récupérer l'utilisateur depuis la base de données\n        return new User { Id = id, Name = "John Doe" };\n    }\n}\n\npublic class EmailService : IEmailService\n{\n    public void SendEmail(string to, string subject)\n    {\n        Console.WriteLine($"Email envoyé à {to} : {subject}");\n    }\n}
\n\n

Créons maintenant la classe UserService qui utilise ces dépendances :

\n\n
public class UserService\n{\n    private readonly IUserRepository _userRepository;\n    private readonly IEmailService _emailService;\n\n    public UserService(IUserRepository userRepository, IEmailService emailService)\n    {\n        _userRepository = userRepository;\n        _emailService = emailService;\n    }\n\n    public void NotifyUser(int userId)\n    {\n        var user = _userRepository.GetUser(userId);\n        _emailService.SendEmail(user.Email, "Bienvenue !");\n    }\n}
\n\n

Enregistrons le tout dans le conteneur DI

Recommendations