gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:33 25 4
gpt4 key购买 nike

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

关于c# - 如何将依赖项注入(inject) System.Web.Http.AuthorizeAttribute 子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33373321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com