22

I really get stuck on the approach to do dependency injection into action filter of web api. I have an action filter like this:

public class AuthorizationAttribute : ActionFilterAttribute
{
    public IApiKeyRepository Repository { get; set; }

    private Guid GetApiKey(string customerKey)
    {
        return Repository.GetApiKey(customerKey);
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {        
    }
}

I would like to do property injection on the property Repository by using Windsor (but it does not matter which IoC container is used)

I did come up to customize FilterProvider but it did not work out for me, does anyone have solution or running code on this? it will be much appreciated

3 Answers 3

4

You need to check your specific IOC implementation. IOC Containers such as NInject and Autofac have some type of filter injection by injecting public properties. Windsor I am unsure about, but here is a link that creates a wrapper which might help with Windsor: http://eagle081183.wordpress.com/2010/09/21/dependency-injection-with-asp-net-mvc-action-filters/ and another article directly addressing the issue with Windsor: http://weblogs.asp.net/psteele/archive/2009/11/04/using-windsor-to-inject-dependencies-into-asp-net-mvc-actionfilters.aspx.

For completeness with NInject and Autofac:

NInject:

Autofac:

**EDIT - additional option **

You should be able to do GlobalConfiguration.Configuration.DependencyResolver.GetService(...) from any filter regardless of the IOC container you are using.

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you for your answer Alex, but most of the link you showed is for MVC, not for Web API, it is kind of different do injection between Web API and MVC, I think.
I have done this successfully with Autofac but can't speak to the others. You should also be able to access the service you want directly from the Filter via GlobalConfiguration.Configuration.DependencyResolver.GetService(...). Not ideal, but it should work.
4

For WebAPI and AutoFac you can use:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

The documentation is here.

Comments

1

You can use the Ninject.Web.WebApi assembly (obviously using Ninject as the IoC) to make this work. I would suggest looking at the source and SampleApplication via https://github.com/ninject/Ninject.Web.WebApi to see how they are accomplishing Filter injection.

2 Comments

Could you outline the steps to use Ninject.Web.WebApi to accomplish filter injection? The SampleApplication isn't very helpful.
Here is a good outline of how the LogFilter in the SampleApplication is working - github.com/ninject/Ninject.Web.WebApi/wiki/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.