如何将依赖项注入System.Web.Http.AuthorizeAttribute子类?

时间:2015-10-27 16:25:34

标签: c# asp.net-web-api dependency-injection unity-container asp.net-web-api2

我正在使用Web API 2和Unity的ASP.NET Web应用程序。我们使用内置System.Web.Http.AuthorizeAttribute的子类来装饰我们的控制器/控制器方法,以便为Web API公开的各种REST端点应用授权。

我们希望能够使用Unity将依赖项注入此属性。我做了很多搜索,但大多数示例与我的用例完全不同,没有用处。

如何使用Unity将依赖项注入我的System.Web.Http.AuthorizeAttribute子类?

我尝试创建一个自定义的FilterProvider,在属性实例上调用Unity的BuildUp方法,但是我不确定我应该扩展哪个基类或者我应该接口正在实施。

1 个答案:

答案 0 :(得分:3)

您必须实现IFilterProvider。如果扩展ActionDescriptorFilterProvider,则可以调用base.GetFilters来获取在控制器和操作级别指定的过滤器。

public class UnityFilterProvider : ActionDescriptorFilterProvider, IFilterProvider
{
    private readonly IUnityContainer _container;

    public UnityFilterProvider(IUnityContainer container)
    {
        _container = container;
    }

    public new IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        var attributes = base.GetFilters(configuration, actionDescriptor).ToList();

        foreach (var attr in attributes)
        {
            _container.BuildUp(attr.Instance.GetType(), attr.Instance);
        }
        return attributes;
    }
}

您必须将其注册到基础架构中,以便使用它而不是默认的:

//Register the filter injector
var providers = config.Services.GetFilterProviders().ToList();
var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider);
config.Services.Remove(typeof(IFilterProvider), defaultprovider);
config.Services.Add(typeof(IFilterProvider), new UnityFilterProvider(UnityConfig.Container));