Sobes.tech
Middle

¿Qué es la inyección de dependencias (DI) en ASP.NET Core?

sobes.tech AI

Respuesta de la IA

La inyección de dependencias (DI) es un patrón de diseño para la inversión de control (IoC), que permite crear código desacoplado. En ASP.NET Core, DI es una función incorporada que facilita la gestión de dependencias entre clases.

Componentes principales de DI en ASP.NET Core:

  1. Servicios: Objetos que proporcionan funcionalidad (por ejemplo, clases de repositorios, servicios de registro).
  2. Contenedor DI: Objeto responsable de resolver dependencias y crear instancias de servicios.
  3. Ciclo de vida de los servicios: Define cuándo y cómo se crean las instancias de los servicios:
    • Transient: Se crea una nueva instancia en cada solicitud de servicio.
    • Scoped: Se crea una instancia por cada solicitud (para aplicaciones web, por cada solicitud HTTP).
    • Singleton: Se crea una instancia en la primera solicitud y se usa durante toda la vida de la aplicación.

Ventajas del uso de DI:

  • Acoplamiento débil: Las clases dependen de abstracciones (interfaces), no de implementaciones concretas.
  • Testabilidad: Es fácil reemplazar dependencias reales por "mocks" o "stubs" en pruebas unitarias.
  • Extensibilidad: Es fácil reemplazar implementaciones de servicios sin cambiar el código que depende de ellos.
  • Gestión de dependencias: El contenedor DI gestiona el ciclo de vida y la creación de instancias.

Ejemplo de registro de servicios en Startup.cs (o Program.cs en .NET 6+):

// En el método ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
    // Registro de un servicio con ciclo de vida singleton
    services.AddSingleton<ILogger, EmailLogger>();

    // Registro de un servicio con ciclo de vida scoped
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Registro de un servicio con ciclo de vida transient
    services.AddTransient<ITransientService, TransientService>();

    // Registro de controladores para inyección de dependencias
    services.AddControllersWithViews();
}
Inyección de dependencias en el constructor del controlador:

```csharp
public class HomeController : Controller
{
    private readonly ILogger _logger;
    private readonly IDataRepository _repository;

    // ASP.NET Core DI resuelve e inyecta automáticamente estas dependencias
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... acciones del controlador
}