La inyección de dependencias es otro campo en el cual podemos encontrar novedades en ASP.NET Core. Debido a que la plataforma se ha rediseñado por completo, el equipo de producto ha adoptado un soporte para la inyección de dependencias incluyendo un contenedor simple por defecto.

Vale aclarar también que este nuevo contenedor para inyección de dependencias tiene el objetivo de proveer un mínimo de funcionalidades básicas que cualquier aplicación puede necesitar normalmente. En ningún momento el objetivo ha sido reemplazar algunos de los contenedores que existen en el mercado, por lo que siempre conviene evaluar las necesidades de cada aplicación en particular para determinar cuál es la mejor opción a usar.

Bien, teniendo esto en cuenta, vamos a ver ahora cómo podemos usar la inyección de dependencias en un proyecto ASP.NET Core.

Lo primero es que vamos a crear una nueva solución web, y en esta vamos a agregar una interface muy sencilla de ejemplo con el siguiente código

public interface IGreetingService
{
    string Greet();
}

Luego vamos a crear una clase que implementa la interface anterior, retornando un mensaje simplemente.

public class GreetingService : IGreetingService
{
    public string Greet()
    {
        return "Hello with dependency injection :)";
    }
}

Como siguiente paso, creamos un controlador que contenga un campo con el tipo de la interface y un constructor con la interface como parámetro. De esta forma una instancia de la clase que implementa la interface podrá ser inyectada a este controlador. El código es el siguiente:

public class HomeController : Controller
{
    private readonly IGreetingService _greetingSvc;
 
    public HomeController(IGreetingService greetingSvc)
    {
        // Instancia de clase inyectada en el constructor se asigna a variable local.
        _greetingSvc = greetingSvc;
    }
 
    public IActionResult Index()
    {
        ViewData["greeting"] = _greetingSvc.Greet();
        return View();
    }
}

También agregaremos una vista donde podamos ver en pantalla el resultado del mensaje enviado desde el controlador en el paso anterior.

@{
    ViewData["Title"] = "Home Page";
}
 
 
<div class="row">
    <div class="col-md-12">
        <h2>@ViewData["greeting"]</h2>
    </div>
</div>

Y el último paso es configurar la interface IGreetingService que creamos y la respectiva clase concreta GreetingService que se va a inyectar en el controlador. Esto lo hacemos en el método ConfigureServices de la clase Startup.cs agregando la siguiente línea de código.

// Inyecta una instancia de esta clase donde se use la interface.
services.AddTransient<IGreetingService, GreetingService>();

Finalmente podemos ejecutar la solución y ver el resultado del funcionamiento de la inyección de dependencias.

coredependencyinjection01

Cabe destacar que configuramos la dependencia mediante el método AddTransient, pero en realidad tenemos 4 formas de hacerlo dependiendo del ciclo de vida que requiera nuestra clase. Las formas disponibles son las siguientes:

Método AddTransient: Se crear una nueva instancia de la clase cada que es requerido. Es lo recomendado en casos donde se tienen clases livianas y sin estado.

Método AddScoped: Se crea una nueva instancia una sola vez por cada request.

Metodo AddSingleton: Se crea una instancia la primera vez que es requerida y luego se reutiliza esa instancia posteriormente en todas las ocasiones que se necesite usar la clase.

Método Instance: Se agrega la instancia a usar directamente en el llamado al método ConfigureServices y luego esa instancia se reutiliza en todas las ocasiones que se necesite usar la clase. Es como el Singleton, pero la diferencia es que en el Singleton la instancia de la clase se crea la primera vez que es requerida.

Bien, eso es todo por este post. Espero que sea útil y lo hayan entendido. Como siempre, los invito a revisar la documentación de ASP.NET Core sobre el tema, donde podrán ver todo esto más a fondo. No olviden dejar sus dudas o comentarios!

El código completo del ejemplo usado en este post lo puedes encontrar en mi cuenta de GitHub.