有关MVC 3中Ninject创建的动作过滤器的生命周期的问题

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上没有控制器或动作方法.

请赐教!

Rem*_*oor 4

我还没有看到 Microsoft 的官方文档 IFilterProvider 被准确调用的时间和频率。但根据我的观察,似乎每个请求都会调用一次。这意味着瞬态绑定过滤器基本上是 InRequestScope 绑定的,区别在于它们不会在请求结束时由 Ninject 处理。

您应该做一些改变:

  • 不要从 ActionFilterAttribute 派生,而是实现 IActionFilter 以防止它被意外用作属性。
  • 重新考虑对所有绑定使用 FilterScope.Global。我认为对以全局优先级运行的操作/控制器进行过滤是一种不好的做法。

另请注意,将为每个匹配绑定创建并执行一个过滤器。这意味着当前带有 RequestType.Undefined 的请求会在每个请求上运行,无论操作或控制器上是否有属性。此外,如果操作和控制器上有属性,则执行它们。