【发布时间】:2017-05-29 19:25:31
【问题描述】:
跟进Authorization Filter Dependency Injection with ASP.New MVC 4 Web Api。有没有办法在所有控制器类上全局设置的过滤器上使用依赖注入:
config.Filters.Add(new WebApplicationApiAuthorizeAttribute());
看起来ActionDescriptorFilterProvider 中的GetFilters 方法仅适用于方法级别的过滤器。
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);
}
}
}
【问题讨论】:
-
好问题。我打算回答它,之前已经多次触及这个话题,但我仍然觉得我没有一个优雅的解决方案。现在,请查看Injecting dependencies into ASP.NET MVC 3 action filters. What's wrong with this approach?,希望Mark Seemann 会发现这个问题。
-
所以@RowanFreeman,根据您的评论,我不清楚是否必须使用 ServiceLocator 来注入类级别的依赖。是否有其他方法或者我是否坚持使用您链接到的文章中提到的反模式?
-
就其价值而言,ServiceLocator 是我在项目中使用的。我不知道将依赖项注入全局过滤器的任何其他优雅方式。 大声思考: 我想知道您是否可以创建一个新的过滤器接口(例如
IInjectableActionFilter),然后使用工厂来创建它们。工厂实际上将由 IoC 容器处理,就像他们通常处理控制器工厂一样。然后容器将负责创建过滤器、应用它并注入依赖项。
标签: asp.net-mvc asp.net-web-api dependency-injection unity-container