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

本文关键字:Http Web AuthorizeAttribute 子类 System 依赖 注入 | 更新日期: 2023-09-27 18:19:25

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

我们希望能够使用Unity将依赖项注入该属性。我已经做了相当多的搜索,但大多数例子只是足够不同于我的用例,没有用处。

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

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

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

你必须实现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));