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: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.
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