La inyección de dependencias es una patrón de diseño que viene integrado en ASP.NET Core. Aquí te mostraremos algunos puntos a tener en cuenta cuando usamos este patrón.

Comencemos a decir que un proyecto de ASP.NET Core es una aplicación de consola que crea un objeto del tipo Microsoft.Extensions.Hosting.IHost que es el responsable de manejar los recursos de la aplicación como el contenedor de dependencias, la configuración, el registro entre otras cosas. El código responsable de crear un IHost en un proyecto de ASP.NET Core se encuentra en el archivo Program.cs con el llamado al método de extensión Host.CreateDefaultBuilder(args)

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Este mismo código esta en el template para un Service Worker pero me parece que es muy oscuro por lo cual antes de de revisar a detalle (cosa que aun no comprendo del todo) la inyección de dependencias en ASP.NET Core empezamos a usar el contenedor de dependencias en una aplicación de consola.

Comenzamos con una aplicación de consola e instalamos el paquete de Nuget Microsoft.Extensions.DependencyInjection

dotnet new console -o PruebasDI
dotnet add package Microsoft.Extensions.DependencyInjection

Con esto podemos crear un objeto de la clase de ServiceCollection y comenzar a agregar dependencias a el especificando su ciclo de vida con alguno de los métodos AddScoped ,AddTransient,,AddSingleton por ejemplo suponiendo que tenemos una clase llamada HolaMundo

ServiceCollection services = new ServiceCollection();
services.AddScoped<HolaMundo>();
services.AddTransient<HolaMundo>();
services.AddSingleton<HolaMundo>();

Hay varias formas de agregar dependencias a contenedor de dependencias. En la primer forma mostrada anteriormente agregamos una clase concreta. Si deseamos especificar una interfaz y su implementación usamos la

services.AddScoped<IHola, HolaMundo>();

Una vez que ya tienes agregas las dependencias al contenedor de dependencias podemos solicitar una dependencias a un objeto de la clase ServiceProvider

ServiceProvider serviceProvider = services.BuildServiceProvider();
serviceProvider.GetService<HolaMundo>();

Inyección de dependencias en ASP.NET Core

El contenedor de dependencias de ASP.NET Core se llena en el método Configure de la clase Startup usando los métodos antes mencionados. Cada que agregas un servicio al contenedor de dependencias este esta disponible para todos las clases de la aplicación solo es necesarios declararlos en en constructor de la clase.

public void ConfigureServices(IServiceCollection services)
{
}

Inyección de dependencias en las vistas

Un caso particular es el uso de la inyección de dependencias en las vistas ya que ellas requieren la directiva @inject para funcionar. Por ejemplo para agregar

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
        <form  class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
            <button  type="submit" class="nav-link btn btn-link text-dark">Logout</button>
        </form>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
}
</ul>

Para llevar

  • El sistema de inyección de dependencias de ASP.NET Core puede ser remplazado por otro.

  • El sistema de inyección de dependencias de ASP.NET Core unicamente soporta la inyección por medio del constructor.