gpt4 book ai didi

asp.net-mvc - 扩展 ActionDescriptor FilterProvider 以允许类级别过滤器的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-05 01:04:44 26 4
gpt4 key购买 nike

跟进Authorization Filter Dependency Injection with ASP.New MVC 4 Web Api .有没有办法在所有 Controller 类上全局设置的过滤器上使用依赖注入(inject):

config.Filters.Add(new WebApplicationApiAuthorizeAttribute());  

它看起来像 GetFilters ActionDescriptorFilterProvider 中的方法仅适用于方法级过滤器。
public class UnityWebApiFilterAttributeFilterProvider : ActionDescriptorFilterProvider,
System.Web.Http.Filters.IFilterProvider
{
private readonly IUnityContainer _container;

public UnityWebApiFilterAttributeFilterProvider(IUnityContainer container)
{
_container = container;
}

public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration,
HttpActionDescriptor actionDescriptor)
{
var filters = base.GetFilters(configuration, actionDescriptor);

this.BuildUpAttributes(filters);

return filters;
}

private void BuildUpAttributes(IEnumerable filterInfo)
{
foreach (FilterInfo filter in filterInfo)
{
object o = _container.BuildUp(filter.GetType(), filter);
}
}
}

最佳答案

如果您希望注入(inject)这些全局过滤器,则必须从容器中解析它们并将它们添加到过滤器集合中:

GlobalFilters.Filters.Add(container.Resolve<MyFilter>());

或执行以下操作:

var filter = WebApplicationApiAuthorizeAttribute();
container.BuildUp(filter.Gettype(), filter);
GlobalFilters.Filters.Add(filter);

但是关于使用全局过滤器的一个大警告。全局过滤器是……全局的。或者在 IoC 术语中:它们是 单例 .这意味着它的所有依赖项也将有效地变成单例,这可能会导致各种并发错误,因为它们预计不会在应用程序的持续时间内存在。

所以你应该只在所有过滤器的直接和间接依赖都是单例时才这样做,如果你能做到这一点,那就太好了,但通常情况并非如此。因此,另一种选择是创建一个允许即时解析真实实例的代理:

public sealed class UnityActionFilterProxy<TActionFilter> : IActionFilter
where TActionFilter : IActionFilter
{
private readonly IUnityContainer container;
public UnityActionFilterProxy(IUnityContainer container) {
this.container = container;
}

public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext context,
CancellationToken token, Func<Task<HttpResponseMessage>> continuation) {
return this.container.Resolve<TActionFilter>().ExecuteActionFilterAsync(
context, token, continuation);
}

public bool AllowMultiple { get { return false; } }
}

该代理可以作为单例注入(inject)到全局过滤器集合中,如下所示:

GlobalFilters.Filters.Add(
container.Resolve<UnityActionFilterProxy<MyFilter>>());

全局过滤器并不是 Web API 中唯一一个设计有点……难闻的地方。看看 this related question关于 DelegatingHandlers。

关于asp.net-mvc - 扩展 ActionDescriptor FilterProvider 以允许类级别过滤器的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22675460/

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