我希望在我的MVC 3应用程序中使用Ninject的全局作用过滤器;但是,我想了解该过滤器的生命周期、其依赖关系以及如何通过装饰我的控制器和/或操作方法来引入其依赖关系的变化。
我希望我的过滤器类型依赖于绑定到请求范围的对象,因此类似于这样:
public sealed class MyGlobalActionFilter : IActionFilter
{
public MyGlobalActionFilter(IService1 svc1, IService2 svc2, RequestType reqType)
{
// code here
}
// IActionFilter implementation here...
}
...在模块配置中...
Bind<IService1>().To<ConcreteService1>().InRequestScope()
Bind<IService2>().To<ConcreteService2>().InRequestScope()
BindFilter<MyGlobalActionFilter>(FilterScope.Global, null)
.WhenControllerHas<RequestTypeAttribute>()
.WithConstructorArgumentFromControllerAttribute<RequestTypeAttribute>(
"reqType",
x => x.RequestType
);
BindFilter<MyGlobalActionFilter>(FilterScope.Global, null)
.WhenActionMethodHas<RequestTypeAttribute>()
.WithConstructorArgumentFromActionAttribute<RequestTypeAttribute>(
"reqType",
x => x.RequestType
);
BindFilter<MyGlobalActionFilter>(FilterScope.Global)
.When(x => true)
.WithConstructorArgument("reqType", RequestType.Undefined)
在控制器和/或操作方法上设置一个属性,表示应用程序特定的“请求类型”:
[RequestType(RequestType.Type1)]
public sealed class SomeController : Controller { /* code here*/ }
我是否正确理解这个应该如何工作?每个HTTP请求都会创建并注入一个新的MyGlobalActionFilter实例吗?如果这样不行,那我漏掉了什么?有什么更好的方法来使其工作?
同时,使用注入的RequestType,在这里绑定过滤器的语法似乎过于冗长,我不确定它是否像我期望的那样工作,并且似乎有更好的方法可以在控制器或动作方法上没有RequestTypeAttribute时将默认RequestType注入到操作过滤器中。
请给我指点!