如何将依赖项注入到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
方法的属性实例,但我不确定哪个基类我应该扩展或接口我应该实现。
你必须实现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));