How to do dependency injection to Action Filter on

2020-05-30 07:35发布

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条回答
smile是对你的礼貌
2楼-- · 2020-05-30 08:00

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.

查看更多
我欲成王,谁敢阻挡
3楼-- · 2020-05-30 08:01

For WebAPI and AutoFac you can use:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

The documentation is here.

查看更多
Bombasti
4楼-- · 2020-05-30 08:02

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.

查看更多
登录 后发表回答