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:
- Servicios: Objetos que proporcionan funcionalidad (por ejemplo, clases de repositorios, servicios de registro).
- Contenedor DI: Objeto responsable de resolver dependencias y crear instancias de servicios.
- 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
}