Fondamentaux des conteneurs DI
Comprenez l’inversion de contrôle, l’enregistrement des services et la façon dont le conteneur DI de .NET résout les dépendances.
Fondamentaux des conteneurs DI est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Qu’est-ce que l’injection de dépendances ?
L’injection de dépendances (DI) est un modèle de conception dans lequel une classe reçoit ses dépendances d’une source externe au lieu de les créer elle-même.
Au lieu d’écrire var repo = new UserRepository(); dans une classe, la classe déclare ce dont elle a besoin et le conteneur DI le fournit.
Inversion du contrôle
La DI est une implémentation concrète du principe d’inversion du contrôle (IoC) : le contrôle de la création des dépendances est transféré de la classe dépendante à un conteneur externe.
Les classes sont ainsi plus faciles à tester et à remplacer.
Configurer le conteneur DI de .NET
Dans une app .NET, le conteneur DI est configuré via IServiceCollection dans Program.cs. Les services sont enregistrés, puis résolus par l’environnement d’exécution.
var builder = WebApplication.CreateBuilder(args);
// Register services
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddScoped<UserService>();
var app = builder.Build();
app.Run();Définir une interface et son implémentation
DI fonctionne au mieux lorsque vous programmez avec des interfaces. Définissez une interface pour le contrat du service ainsi qu’une classe concrète qui l’implémente.
public interface IUserRepository
{
User? GetById(int id);
}
public class UserRepository : IUserRepository
{
public User? GetById(int id)
{
// fetch from database
return new User { Id = id, Name = "Alice" };
}
}Résoudre des services par le constructeur
Le conteneur injecte automatiquement les services enregistrés dans les constructeurs. La classe doit seulement déclarer l’interface dont elle a besoin : le mot-clé new n’est pas nécessaire.
public class UserService
{
private readonly IUserRepository _repo;
public UserService(IUserRepository repo)
{
_repo = repo;
}
public User? FindUser(int id) => _repo.GetById(id);
}Enregistrer plusieurs services
Vous pouvez enregistrer autant de services que nécessaire. Les méthodes d’extension courantes sont AddTransient, AddScoped et AddSingleton : chacune définit une durée de vie différente.
builder.Services.AddSingleton<IConfig, AppConfig>();
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddTransient<IEmailService, SmtpEmailService>();
builder.Services.AddScoped<UserService>();Utiliser IServiceProvider directement
Dans de rares cas, vous devez résoudre des services de manière impérative. IServiceProvider vous permet d’appeler GetRequiredService<T>() pour résoudre un service, mais privilégiez l’injection par constructeur dans la plupart des situations.
// Anti-pattern (service locator) — use sparingly
public class ManualResolver
{
private readonly IServiceProvider _sp;
public ManualResolver(IServiceProvider sp) => _sp = sp;
public void DoWork()
{
var svc = _sp.GetRequiredService<UserService>();
svc.FindUser(1);
}
}Enregistrer des types génériques ouverts
La DI de .NET prend en charge l’enregistrement de types génériques ouverts. Vous pouvez enregistrer IRepository<> une seule fois : il sera résolu en Repository<T> pour tout type d’entité.
builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
// Resolves as:
// IRepository<User> -> Repository<User>
// IRepository<Order> -> Repository<Order>Valider au démarrage
Avec ValidateOnStart() ou ValidateScopes = true, le conteneur peut détecter les enregistrements mal configurés, par exemple lorsqu’un service à portée limitée est capturé par un service à instance unique, dès le démarrage de l’application plutôt qu’à l’exécution.
builder.Services.AddScoped<IMyService, MyService>();
// Detect scope violations at startup
builder.Host.UseDefaultServiceProvider(options =>
{
options.ValidateScopes = true;
options.ValidateOnBuild = true;
});Décorer des services
Vous pouvez envelopper un service dans un décorateur sans modifier la classe d’origine. Enregistrez d’abord le service interne, puis le décorateur qui l’enveloppe.
builder.Services.AddScoped<IUserRepository, UserRepository>();
// Decorator pattern
builder.Services.Decorate<IUserRepository, CachedUserRepository>();
// Requires Scrutor NuGet packageCas concret : API minimale avec DI
Dans une API minimale, les services sont injectés directement dans les paramètres du gestionnaire de route. Le conteneur les résout automatiquement.
app.MapGet("/users/{id}", (int id, UserService svc) =>
{
var user = svc.FindUser(id);
return user is null ? Results.NotFound() : Results.Ok(user);
});Vérification rapide
Quelle méthode devez-vous privilégier pour obtenir les dépendances dans la plupart des classes ?
Récapitulatif : fondamentaux du conteneur DI
Points essentiels :
- DI inverse la création des dépendances : le conteneur construit les objets, et non la classe elle-même
- Enregistrez les services avec AddTransient / AddScoped / AddSingleton
- L’injection par constructeur est l’approche standard à privilégier
- Les types génériques ouverts, les décorateurs et ValidateOnBuild sont des fonctionnalités avancées puissantes
Apprends C# avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 93
- Leçons
- 346
Questions Fréquemment Posées
La leçon « Fondamentaux des conteneurs DI » est-elle gratuite ?
Oui — le texte complet de « Fondamentaux des conteneurs DI » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Fondamentaux des conteneurs DI » ?
Comprenez l’inversion de contrôle, l’enregistrement des services et la façon dont le conteneur DI de .NET résout les dépendances. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Fondamentaux des conteneurs DI » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Fondamentaux des conteneurs DI
- Durées de vie des services : Transient, Scoped, Singleton
- Injection par constructeur et interfaces
- Patrons Factory et Options