Páginas

23 de junio de 2015

Inyección de dependencias en filtros MVC 6

ASP.NET MVCLos filtros de MVC, o action filters, han sido potenciados en la versión 6 del framework añadiéndoles características que en versiones anteriores no estaban disponibles de serie en la plataforma pero que han sido muy solicitadas por los desarrolladores. Hace algún tiempo vimos una de ellas, los filtros asíncronos, y hoy veremos que la inyección de dependencias en filtros también es ya una realidad.



El problema con la inyección de dependencias en los filtros es la instanciación de éstos, pues al definirse en forma de atributos de .NET no puede realizarse de forma controlada, o al menos lo suficientemente controlada como para poder inyectarles parámetros en el constructor o cargar sus propiedades desde un contenedor de inversión de control. Y aunque los filter providers aportaron alguna solución vía los contenedores IoC más populares, aún no eran una solución todo lo limpia que debería ser.

Pero como decía David Wheeler, “Cualquier problema en ciencias de la computación puede ser solucionado con otro nivel de indirección”… y eso mismo han debido pensar la gente del equipo de ASP.NET en Microsoft, cuando la solución que han dado consiste, básicamente, en crear un filtro capaz de instanciar otros filtros usando el contenedor de servicios integrado :)


Veámoslo con un ejemplo. El siguiente ejemplo implementa un filtro asíncrono de MVC 6 cuya misión es almacenar en un log las acciones ejecutadas por los usuarios:



Observad que el almacenamiento del log se realiza utilizando un servicio externo, una instancia de IUserLoggingServices inyectada en el constructor del filtro.

Este filtro no podemos aplicarlo directamente sobre nuestras acciones o controladores, pues el framework no podría crear una instancia satisfaciendo sus dependencias. Lo que tenemos que hacer en este caso es registrarlo en el contenedor de dependencias de ASP.NET 5, tarea que se hace en el método ConfigureServices() de la clase Startup:

Configuración de servicios en la clase Startup

En esta porción de código fijaos estamos registrando también la clase IUserLoggingServices para asegurar que la dependencia de nuestro filtro pueda resolverse correctamente.

Por último, ya sólo tenemos que aplicar el filtro a los controladores o acciones que nos interesen. Para ello, en lugar de hacerlo directamente, utilizaremos el filtro ServiceFilter, que actuará como factoría creando la instancia del filtro que le suministremos como parámetro, utilizando el contenedor de dependencias.

Uso de ServiceFilter en un controlador

Y eso es todo :) Como hemos podido ver, algo que en versiones anteriores era bastante complicado, o incluso imposible, como la inyección de dependencias en constructores de filtros, tiene solución trivial en el nuevo MVC 6 / ASP.NET 5.

Publicado en Variable not found.


from Variable not found http://www.variablenotfound.com/2015/06/inyeccion-de-dependencias-en-filtros.html
via IFTTT