Compartir tecnología

Contenedor C# IOC, inyección de dependencia e inversión de control

2024-07-12

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

Inversión de control (IoC)

definición : La inversión de control es un principio de diseño que invierte el flujo de control en la programación tradicional. En los modelos de programación tradicionales, las dependencias entre componentes son creadas y mantenidas internamente por los propios componentes. En el modo de inversión de control, esta dependencia es administrada por un contenedor externo (como Spring Framework, Microsoft.Extensions.DependencyInjection en .NET, etc.). El componente ya no es responsable de sus propias dependencias, pero inyecta todas las dependencias. a través del contenedor externo.

Idea principal: Mueve la creación de objetos y la gestión de dependencias entre ellos desde los propios objetos a contenedores externos.

ventaja

  • Reducir el acoplamiento: Las dependencias entre componentes ya no están codificadas, por lo que las implementaciones de componentes se pueden reemplazar más fácilmente, lo que mejora la flexibilidad y la capacidad de mantenimiento del sistema.
  • Mejorar la modularidad: Los componentes individuales se pueden desarrollar y probar de forma independiente porque no dependen de implementaciones específicas, sino de interfaces abstractas o clases abstractas.
  • Fácil de probar: Dado que las dependencias entre componentes están externalizadas, es más fácil utilizar objetos simulados o resguardos de prueba para simular dependencias para pruebas unitarias.

Inyección de dependencia (DI)

definición : La inyección de dependencia es una forma específica de lograr la inversión de control. Implica pasar dependencias (servicios u objetos) a clases en lugar de dejar que las clases las creen ellas mismas.

Método para realizar

  • inyección constructora : Las dependencias se proporcionan a través del constructor de la clase. Esta es la forma más común y recomendada de DI en C#.
  • Inyección de propiedad : Asigna dependencias a través de propiedades públicas de la clase. Este enfoque proporciona flexibilidad pero puede exponer el estado interno y reducir la encapsulación.
  • método de inyección : Pasa dependencias a través de parámetros del método. Adecuado para inyectar solo las dependencias requeridas por un método específico.

contenedor del COI

definición : El contenedor IOC es un marco para gestionar el ciclo de vida y las dependencias de los objetos. Crea automáticamente objetos basados ​​en la configuración (como archivos XML, anotaciones o configuración de código) e inyecta dependencias en estos objetos.

efecto

  • creación de objetos: Crea automáticamente instancias de objetos según la configuración.
  • inyección de dependencia: Inyecta dependencias en objetos para lograr la inversión de control.
  • Gestión del ciclo de vida: Gestionar el ciclo de vida de los objetos, incluida la creación, destrucción y reciclaje de recursos.

Utilice contenedores IOC para gestionar dependencias

En C#, puede utilizar una variedad de contenedores IOC para administrar dependencias, como Microsoft.Extensions.DependencyInjection (el contenedor DI integrado de .NET Core y versiones posteriores), Autofac, etc. A continuación se toma Microsoft.Extensions.DependencyInjection como ejemplo para presentar cómo usar contenedores IOC para administrar dependencias en proyectos de C#.

Paso 1: Regístrese para el servicio

Los servicios se utilizan normalmente en aplicaciones .NET.Program.csoStartup.cs(para proyectos ASP.NET Core) utilizado enIServiceCollectioninterfaz para registrarse.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>(); // 将MyService注册为单例服务
    // 其他服务注册
}
  • 1
  • 2
  • 3
  • 4
  • 5
Paso 2: inyectar dependencias

Inyecte dependencias en el controlador, servicio o cualquier otra clase a través del constructor.

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

En el ejemplo anterior,MyControllerLa clase se inyecta a través del constructor.IMyServiceLa implementación de la interfaz (es decir.MyService amable).De esta manera, cuandoMyControllerCuando se crea, el contenedor IOC automáticamenteIMyServiceLa implementación se inyecta en el constructor.

Precauciones
  • Utilice abstracciones basadas en interfaces: Prefiera interfaces o clases abstractas para tipos dependientes para mejorar la flexibilidad y la capacidad de prueba.
  • Evite el uso excesivo de singletons: Los servicios Singleton deben usarse con precaución para evitar problemas relacionados con el estado.
  • Monitorear el ciclo de vida del objeto: Comprenda el ciclo de vida de las dependencias (singleton, alcance, transitorio) para gestionar eficazmente el uso de recursos.