我有一个从AuthorizationAttribute派生的自定义属性类,它执行控制器操作的自定义安全性. OnAuthorizationCore方法取决于各种其他组件(例如DAL),以便判断用户是否可以调用动作.
我使用Autofac进行依赖注入. ExtensibleActionInvoker声称能够对动作过滤器执行属性注入.在运行时设置属性的属性(这似乎是一个坏主意)可以在一个简单的单元测试中工作,但是在一个繁忙的多线程Web服务器中,它必然会出错,所以这个想法似乎是一个反模式.因此这个问题:
如果我的AuthorizationAttribute依赖于其他组件才能正常工作,为什么要正确的[架构]模式才能实现?
即AuthorizationAttribute取决于IUserRepository …如何解决这种关系?
解决方法
The ExtensibleActionInvoker claims to be able to perform property injection on action filters.
正确 – 但不要将操作过滤器与可能无法实现的属性混淆.在ASP.NET MVC中最简单的方法是分担责任,即使MVC框架允许您组合它们.
例如,使用一对类 – 只保存数据的属性类:
// Just a regular old attribute with data values class SomeAttribute : Attribute { ... }
还有一个注入了依赖关系的过滤器:
// Gets dependencies injected class SomeFilter : IActionFilter { ... }
SomeFilter仅使用通过GetCustomAttributes()从控制器或操作方法获取SomeAttribute属性来执行任何需要的工作的典型方法.
然后,您可以使用ExtensibleActionInvoker连接过滤器:
builder.RegisterControllers(...).InjectActionInvoker(); builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>(); builder.RegisterType<SomeFilter>().As<IActionFilter>();
它可能比使用属性为过滤器方法编写的代码要多一些,但从长远来看,代码的质量会更好(例如,通过避免属性的限制和服务定位器解决方案的尴尬.)