Partage de technologie

Conteneur C# IOC, injection de dépendances et inversion de contrôle

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Inversion de contrôle (IoC)

définition : L'inversion du contrôle est un principe de conception qui inverse le flux de contrôle dans la programmation traditionnelle. Dans les modèles de programmation traditionnels, les dépendances entre les composants sont créées et maintenues en interne par les composants eux-mêmes. En mode inversion de contrôle, cette dépendance est gérée par un conteneur externe (comme le framework Spring, Microsoft.Extensions.DependencyInjection en .NET, etc.). Le composant n'est plus responsable de ses propres dépendances, mais injecte toutes les dépendances. via le conteneur externe requis.

idée principale: Déplace la création d'objets et la gestion des dépendances entre eux des objets eux-mêmes vers des conteneurs externes.

avantage

  • Réduire l'accouplement: Les dépendances entre les composants ne sont plus codées en dur, de sorte que les implémentations de composants peuvent être remplacées plus facilement, améliorant ainsi la flexibilité et la maintenabilité du système.
  • Améliorer la modularité: Les composants individuels peuvent être développés et testés indépendamment car ils ne s'appuient pas sur des implémentations spécifiques, mais sur des interfaces abstraites ou des classes abstraites.
  • Facile à tester: Étant donné que les dépendances entre les composants sont externalisées, il est plus facile d'utiliser des objets fictifs ou des talons de test pour simuler les dépendances pour les tests unitaires.

Injection de dépendances (DI)

définition : L'injection de dépendances est un moyen spécifique de réaliser une inversion de contrôle. Cela implique de transmettre des dépendances (services ou objets) dans des classes au lieu de laisser les classes les créer elles-mêmes.

Méthode pour réaliser

  • injection constructeur : Les dépendances sont fournies via le constructeur de la classe. Il s’agit de la forme de DI la plus courante et recommandée en C#.
  • Injection de propriété : Attribuez des dépendances via les propriétés publiques de la classe. Cette approche offre de la flexibilité mais peut exposer l'état interne et réduire l'encapsulation.
  • méthode d'injection : Transmettez les dépendances via les paramètres de la méthode. Convient pour injecter uniquement les dépendances requises par une méthode spécifique.

Conteneur CIO

définition Le conteneur :IOC est un framework pour gérer le cycle de vie et les dépendances des objets. Il crée automatiquement des objets basés sur la configuration (tels que des fichiers XML, des annotations ou une configuration de code) et injecte des dépendances dans ces objets.

effet

  • Création d'objet : Créez automatiquement des instances d'objet en fonction de la configuration.
  • injection de dépendance: Injectez des dépendances dans les objets pour réaliser une inversion de contrôle.
  • la gestion du cycle de vie: Gérer le cycle de vie des objets, incluant la création, la destruction et le recyclage des ressources.

Utiliser des conteneurs IOC pour gérer les dépendances

En C#, vous pouvez utiliser une variété de conteneurs IOC pour gérer les dépendances, tels que Microsoft.Extensions.DependencyInjection (le conteneur DI intégré de .NET Core et versions ultérieures), Autofac, etc. Ce qui suit prend Microsoft.Extensions.DependencyInjection comme exemple pour présenter comment utiliser les conteneurs IOC pour gérer les dépendances dans les projets C#.

Étape 1 : Inscrivez-vous au service

Les services sont généralement utilisés dans les applications .NETProgram.csouStartup.cs(pour les projets ASP.NET Core) utilisé dansIServiceCollectioninterface pour vous inscrire.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>(); // 将MyService注册为单例服务
    // 其他服务注册
}
  • 1
  • 2
  • 3
  • 4
  • 5
Étape 2 : injecter des dépendances

Injectez des dépendances dans le contrôleur, le service ou toute autre classe via le constructeur.

public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    // ... 控制器的其他代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Dans l'exemple ci-dessus,MyControllerLa classe est injectée via le constructeurIMyServiceLa mise en œuvre de l'interface (c'est-à-direMyService gentil).De cette façon, quandMyControllerUne fois créé, le conteneur IOC sera automatiquementIMyServiceL'implémentation est injectée dans le constructeur.

Précautions
  • Utiliser des abstractions basées sur l'interface: Préférez les interfaces ou les classes abstraites pour les types dépendants afin d’améliorer la flexibilité et la testabilité.
  • Évitez la surutilisation des singletons: Les services Singleton doivent être utilisés avec prudence pour éviter les problèmes liés à l'état.
  • Surveiller le cycle de vie des objets: Comprendre le cycle de vie des dépendances (singleton, scope, transitoire) pour gérer efficacement l'utilisation des ressources.