Pregunta

tengo una costumbre simple FilterAttribute que uso para decorar varios ActionMethods.

p.ej.

[AcceptVerbs(HttpVerbs.Get)]
[MyCustomFilter]
public ActionResult Bar(...)
{ ... }

Ahora, deseo agregar algo de registro a esta acción CustomFilter.así que siendo un buen chico, estoy usando DI/IoC ...y como tal deseo usar este patrón para mi costumbre FilterAttribute.

Entonces si tengo lo siguiente...

ILoggingService

y deseo agregar esta mi costumbre FilterAttribute ..No estoy seguro de cómo.Es fácil para mí hacer lo siguiente...

public class MyCustomFilterAttribute : FilterAttribute
{
    public MyCustomFilterAttribute(ILoggingService loggingService)
    { ... }
}

Pero los errores del compilador dicen el atributo que decora mi ActionMethod (listados arriba...) requiere 1 argumento ..así que no estoy seguro de qué hacer :(

¿Fue útil?

Solución

Tengo inyección propiedad trabajar con Ninject y la Ninject.Web.MVC .

Mientras que tenga el controlador de la fábrica de Ninject.Web.MVC, es bastante simple.

por ejemplo.

public class EventExistsAttribute : FilterAttribute, IActionFilter
{
    [Inject]
    public IEventRepository EventRepo { private get; set; }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //Do stuff
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //Do something else if you so wish...
    }
}

Tiene el inconveniente de que tiene esencialmente una dependencia 'oculta', por así decirlo ... pero no hay mucho que se pueda hacer al respecto.

HTHS, España Charles

Otros consejos

Usted tiene que escribir su propio IActionInvoker y hacer la inyección propiedad. Echar un vistazo a este post por Jimmy Bogard para ideas.

Sí, es posible utilizar la inyección de dependencia en un FilterAttribute.Sin embargo, no es posible utilizar la inyección de constructor en un FilterAttribute.Esto no es una limitación de ASP.NET MVC, es común a todo el código .Net, como los valores pasados ​​a un constructor de atributos se limitan a tipos simples.

[MyFilter(ILogger logger)] // this will not compile
public ActionResult Index()
{
    return View();
}

Entonces, la práctica común es hacer de la dependencia un propiedad de su filtro, como en el ejemplo de @Charlino.Luego puede utilizar la inyección de propiedades.Puedes usar Ninject para decorar la propiedad del filtro como en el ejemplo de @Charlino.O como sugiere @mrydengren, puedes hacer esto en una subclase personalizada de ControllerActionInvoker.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top