Mar*_*ark 13 asp.net-mvc dependency-injection filter autofac
我有一个派生自AuthorizationAttribute的自定义属性类,它对控制器操作执行自定义安全性.OnAuthorizationCore方法依赖于各种其他组件(例如DAL)以判断用户是否可以调用操作.
我正在使用Autofac进行依赖注入.ExtensibleActionInvoker声称能够在动作过滤器上执行属性注入.在运行时设置属性的属性(这似乎是一个坏主意)将在一个简单的单元测试中工作,但在繁忙的多线程Web服务器中它肯定会出错,所以这个想法似乎是一种反模式.因此这个问题:
如果我的AuthorizationAttribute依赖于其他组件才能正常工作,那么正确的[架构]模式是什么才能实现这一目标?
即AuthorizationAttribute取决于IUserRepository ...如何应这种关系来解决?
Nic*_*rdt 17
ExtensibleActionInvoker声称能够在动作过滤器上执行属性注入.
正确 - 但不要将动作过滤器与可能无法实现它们的属性混淆.在ASP.NET MVC中处理此问题的最简洁方法是分割职责,即使MVC框架允许您将它们组合在一起.
例如,使用一对类 - 仅包含数据的属性类:
// Just a regular old attribute with data values
class SomeAttribute : Attribute { ... }
Run Code Online (Sandbox Code Playgroud)
并且注入了依赖项的过滤器:
// Gets dependencies injected
class SomeFilter : IActionFilter { ... }
Run Code Online (Sandbox Code Playgroud)
SomeFilter
只是使用SomeAttribute
从控制器或动作方法获取属性的典型方法GetCustomAttributes()
来完成所需的任何工作.
然后,您可以使用ExtensibleActionInvoker
连接过滤器:
builder.RegisterControllers(...).InjectActionInvoker();
builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();
builder.RegisterType<SomeFilter>().As<IActionFilter>();
Run Code Online (Sandbox Code Playgroud)
它可能比使用属性过滤器方法编写的代码多一点,但从长远来看代码的质量会更好(例如,通过避免属性的限制和服务定位器解决方案的尴尬.)
归档时间: |
|
查看次数: |
5778 次 |
最近记录: |