我正在开发一个使用 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));
