如何将依赖关系注入到自定义FilterAttributes中?
我有一个自定义HandleErrorAttribute
扩展FilterAttribute
。
我如何让Unity在它注入控制器的依赖关系的同时将依赖关系注入到这个属性中?
好吧,算出来。
大多数情况下,我在他指出的博客文章中使用了Ben的解决方案。
问题是Unity的行为有点不同。
您不能直接在过滤器上注入依赖项,因为它们分别是IActionFilter和IExceptionFilter类型。 这让我相信他们是只读的,事实并非如此。 只是Unity需要知道显式类型才能注入。
因此,在本文提供的重写方法中,Unity用户需要查询相关类型的过滤器,然后构建它们。
public UnityActionInvoker(IUnityContainer container, IList<Type> typesToInject)
{
_container = container;
_typesToInject = typesToInject;
}
然后在重写的方法中,执行如下操作:
var needsInjection = filters.Where(filter => typesToInject.Contains(filter.GetType()));
有点混乱,但它只需要做一次,并保持一切解除本本建议。
另一个问题是你不能在foreach循环中调用_container.BuildUp(filter),因为该过滤器在该上下文中是只读的。
你有两个选择
第一种选择是编写一个自定义的ActionInvoker,它不像听起来那么难。 看看这篇博文。 它专门处理NInject,但Unity支持属性注入,因此您可以修改示例以使用Unity。
这是耦合您的IoC容器的选项,不建议使用。
public class MyFilter
{
IMyService MyService {get; set;}
MyFilter() : MyFilter(MyUnityContainer.Resolve<IMyService>())
{ }
MyFilter(IMyService service)
{
MyService = service;
}
}
我也遇到了这个问题,现在有一个工作解决方案。 它与上述解决方案类似,但略有不同,并且还添加了完整的Unity代码。
首先,我将使用属性注入的原因如上所述,如上所述,我将在Unity上使用BuildUp方法将属性注入到已创建的过滤器中。
为此,我将所有的控制器从一个新的自定义基类继承。 在该基类上,我重写了CreateActionInvoker方法以设置我自己的自定义ActionInvoker。
Protected Overrides Function CreateActionInvoker() As System.Web.Mvc.IActionInvoker
Return CustomActionInvoker
End Function
然后在我的CustomActionInvoker中,我重写了GetFilters方法。
Protected Overrides Function GetFilters(ByVal controllerContext As ControllerContext, ByVal actionDescriptor As ActionDescriptor) As FilterInfo
Dim info = MyBase.GetFilters(controllerContext, actionDescriptor)
For Each MyAuthorizationFilter In info.AuthorizationFilters
MvcApplication.Container.BuildUp(MyAuthorizationFilter.GetType, MyAuthorizationFilter)
Next
For Each MyActionFilter In info.ActionFilters
MvcApplication.Container.BuildUp(MyActionFilter.GetType, MyActionFilter)
Next
For Each MyResultFilter In info.ResultFilters
MvcApplication.Container.BuildUp(MyResultFilter.GetType, MyResultFilter)
Next
For Each MyExceptionFilter In info.ExceptionFilters
MvcApplication.Container.BuildUp(MyExceptionFilter.GetType, MyExceptionFilter)
Next
Return info
End Function
与上述内容相反,我没有发现在For Each循环内部进行堆积会造成任何问题。 我还通过使用BuildUp方法的其中一个重载方法(它接受System.Type以及现有对象)克服了仅通过接口引用对象的原始问题。
完成上述所有操作之后,我现在可以将依赖关系直接注入到我的过滤器中。
任何意见和想法非常感谢。
干杯迈克
链接地址: http://www.djcxy.com/p/42737.html上一篇: How to inject dependencies into custom FilterAttributes?