ASP.NET

ASP.NET 5 – Integrate dependency injection

· por Marc Rubiño

Hace días que tenía preparada esta entrada, pero entre el revuelo del Build y todas las novedades que se prometían, tenía guardado este artículo en la recámara por si anunciaban alguna novedad sobre el tema.

InjectionHasta ahora para hacer inyección de dependencias en nuestras aplicaciones web, teníamos que utilizar librerías de terceros como (Unity, Autofac, Ninject, etc), pero a partir de ahora ASP.NET 5 traerá incorporado su propio contenedor de dependencias.

Este contenedor es una versión ligera, pero nos aporta soporte completo de la pila del proceso web. Se puede acceder a los servicios en el startup, en los middleware, en los filtros, en los controladores, en el model binding,  etc.

El contenedor predeterminado es útil en los casos en que no se necesite ninguna capacidad de inyección avanzadas, pero si quieres utilizar un contenedor más completo, se puede utilizar la librería que más os guste gracias al IServiceProvider.

Como funciona

Como he comentado anteriormente la utilización de la inyección de dependencias en ASP.NET 5 es muy sencilla. Lo primero que tenemos que conocer es los tipos de ciclo de vida que soporta.

 /**************** Instance Injection ******************/
 var service = new UserService();
 services.AddInstance<IUserService>(service);
/**************** Transient Injection *****************/
 services.AddTransient<IUserService, UserService>();
/**************** Singleton Injection *****************/
 services.AddSingleton<IUserService, UserService>();
/**************** Scope Injection *****************/
 services.AddScoped<IUserService, UserService>();

Tipos de Inyección

Aunque el contenedor que trae por defecto ASP.NET 5 es muy sencillo tenemos diferentes opciones para realizar nuestra inyección de dependencias.

 private readonly IUserService Service;
 public HomeController(IUserService service)
 {
    Service = service;
 }
[Activate]
 public IUserService UserService { get; set; }
 public IActionResult Index()
 {
    var users = UserService.GetAll();
    return View(users);
 }
 @using Di.Core.Interfaces
 @inject IUserService service
 <div class="row">
 <h1>Inject from Razor</h1>
 <div class="col-lg-12">
 Name: <b> @service.GetName()</b>
 </div>
 </div>

Di

Custom Injection

Como he comentado antes utilizar nuestro contenedor preferido es muy fácil. Solo tenemos que modificar la función ConfigureServices para que devuelva la interface IServiceProvider.

 public IServiceProvider ConfigureServices(IServiceCollection services)
 {…

Para probar esta opción me he instalado la versión alpha1 de Autofac, Autofac.Dnx que soporta ASP.NET Core 5

Di2

Luego lo único que tenemos que hacer es crear el contenedor registrar los tipos que necesitemos y devolver el contenedor como un ServiceProvider.

 // Create the autofac container
 var builder = new ContainerBuilder();
 builder.Populate(services);
 builder.RegisterType<UserService>().As<IUserService>(); 
 var container = builder.Build();
 return container.Resolve<IServiceProvider>();

Extensores

Para finalizar, si queremos utilizar EF, Identity o los propios servicios de MVC.

ASP.NET 5 pone a nuestra disposición los extensores, que nos proporciona la manera de inyectar estos servicios sin complicaciones y ahorrándonos trabajo.

// Add EF services to the services container.
 services.AddEntityFramework(Configuration)
 .AddSqlServer()
 .AddDbContext<ApplicationDbContext>();
 // Add Identity services to the services container.
 services.AddIdentity<ApplicationUser, IdentityRole>(Configuration)
 .AddEntityFrameworkStores<ApplicationDbContext>();
 // Add MVC services to the services container.
 services.AddMvc();
//Web API 2 Controllers
services.AddWebApiConventions();

Bueno espero que todas estas novedades hagan que nuestras aplicaciones sean mucho menos complejas de configurar ayudándonos a utilizar la inyección de dependencias de la forma más sencilla.

 Recordar que la versión actual de ASP.NET 5 es una beta y puede que cuando tengamos la versión final se hayan añadido o eliminado cosas.

 EjemploMaterial