FMM*_*FMM 6 c# ninject asp.net-mvc-3
我想在使用Ninject的MVC 3应用程序中使用全局范围的动作过滤器; 但是,我试图了解该过滤器的生命周期,它的依赖关系,以及如何通过修饰我的控制器和/或操作方法来为其依赖项引入变体.
我想让我的过滤器类型依赖于生命周期必然要求范围的对象,所以,像这样:
public sealed class MyGlobalActionFilter : IActionFilter
{
public MyGlobalActionFilter(IService1 svc1, IService2 svc2, RequestType reqType)
{
// code here
}
// IActionFilter implementation here...
}
Run Code Online (Sandbox Code Playgroud)
......并在模块配置中......
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)
Run Code Online (Sandbox Code Playgroud)
控制器和/或操作方法的属性表示特定于应用程序的"请求类型":
[RequestType(RequestType.Type1)]
public sealed class SomeController : Controller { /* code here*/ }
Run Code Online (Sandbox Code Playgroud)
我是否正确理解这应该如何运作?MyGlobalActionFilter的新实例是否会在每个HTTP请求上启动并注入?如果这不起作用,我错过了什么,以及什么是更好的方法来使这项工作?
此外,通过注入RequestType,BindFilter这里的语法似乎不必要地冗长,我不确定它是否像我期望的那样工作,并且似乎有更好的方法将默认值RequestType注入动作过滤器,如果a RequestTypeAttribute上没有控制器或动作方法.
请赐教!
我还没有看到 Microsoft 的官方文档 IFilterProvider 被准确调用的时间和频率。但根据我的观察,似乎每个请求都会调用一次。这意味着瞬态绑定过滤器基本上是 InRequestScope 绑定的,区别在于它们不会在请求结束时由 Ninject 处理。
您应该做一些改变:
另请注意,将为每个匹配绑定创建并执行一个过滤器。这意味着当前带有 RequestType.Undefined 的请求会在每个请求上运行,无论操作或控制器上是否有属性。此外,如果操作和控制器上有属性,则执行它们。
| 归档时间: |
|
| 查看次数: |
1205 次 |
| 最近记录: |