如何将依赖项注入 System.Web.Http.AuthorizeAttribute 子类?
How can I inject dependencies into a System.Web.Http.AuthorizeAttribute subclass?
我正在开发一个使用 Web API 2 和 Unity 的 ASP.NET 网络应用程序。我们用内置 System.Web.Http.AuthorizeAttribute 的子 class 修饰了我们的 controllers/controller 方法,以对 Web API 公开的各种 REST 端点应用授权。
我们希望能够使用 Unity 将依赖项注入此属性。我已经做了很多搜索,但大多数示例与我的用例差异很大,没有用。
如何使用 Unity 将依赖项注入我的 System.Web.Http.AuthorizeAttribute subclass?
我已经尝试创建一个自定义 FilterProvider,它在属性实例上调用 Unity 的 BuildUp
方法,但我不确定我应该扩展哪个基础 class 或我应该实现哪个接口.
您必须实施 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));
我正在开发一个使用 Web API 2 和 Unity 的 ASP.NET 网络应用程序。我们用内置 System.Web.Http.AuthorizeAttribute 的子 class 修饰了我们的 controllers/controller 方法,以对 Web API 公开的各种 REST 端点应用授权。
我们希望能够使用 Unity 将依赖项注入此属性。我已经做了很多搜索,但大多数示例与我的用例差异很大,没有用。
如何使用 Unity 将依赖项注入我的 System.Web.Http.AuthorizeAttribute subclass?
我已经尝试创建一个自定义 FilterProvider,它在属性实例上调用 Unity 的 BuildUp
方法,但我不确定我应该扩展哪个基础 class 或我应该实现哪个接口.
您必须实施 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));