Skip to main content
 首页 » 编程设计

c#之如何将依赖项注入(inject) System.Web.Http.AuthorizeAttribute 子类

2024年05月22日40飞鱼

我正在开发一个使用 Web API 2 和 Unity 的 ASP.NET Web 应用程序。我们用内置 System.Web.Http.AuthorizeAttribute 的子类装饰了我们的 Controller / Controller 方法。为 Web API 公开的各种 REST 端点申请授权。

我们希望能够使用 Unity 将依赖项注入(inject)此属性。我进行了相当多的搜索,但大多数示例与我的用例差异很大,因此没有用。

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

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

请您参考如下方法:

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

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));