asp.net-mvcdependency-injectioninversion-of-controlfilterattribute

Is it possible to use Dependency Injection/IoC on an ASP.NET MVC FilterAttribute?


I've got a simple custom FilterAttribute which I use decorate various ActionMethods.

eg.

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

Now, I wish to add some logging to this CustomFilter Action .. so being a good boy, I'm using DI/IoC ... and as such wish to use this pattern for my custom FilterAttribute.

So if i have the following...

ILoggingService

and wish to add this my custom FilterAttribute .. i'm not sure how. Like, it's easy for me to do the following...

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

But the compiler errors saying the attribute which decorates my ActionMethod (listed above...) requires 1 arg .. so i'm just not sure what to do :(


Solution

  • I've got property injection working with Ninject and the Ninject.Web.MVC.

    As long as you've got the controller factory from Ninject.Web.MVC, it's rather simple.

    E.g.

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

    It has the drawback of essentially having a 'hidden' dependency, so to say... but there ain't much you can do about that.

    HTHs,
    Charles