InjectableFilterAttribute永远不会命中过滤器

时间:2009-12-22 09:46:55

标签: c# attributes ioc-container turbine

在我的基本控制器上,我放置了Logger属性。 此LoggerAttribute如下所示:

public class LoggerAttribute: InjectableFilterAttribute
{
    public override Type FilterType
    {
        get { return typeof (LoggerActionFilter); }
    }
}

此loggerattribute上的ctor被命中,但FilterType getter没有。

过滤器本身的相关部分如下所示:

public class LoggerActionFilter: IActionFilter
{
    private readonly ILoggerService logger;

    public LoggerActionFilter (ILoggerService logger)
    {
        this.logger = logger;
    }
    <IActionFilter Implementeation>
}

过滤器的ctor也不会被击中。

对于我的服务的连接和servicelocator的实例化检查here
可以在here

找到ILoggerService的注册

我错过了什么?

2 个答案:

答案 0 :(得分:1)

这应该自动提供为应用程序配置正确的ControllerFactory。

据我所知,这必须是TurbineControllerFactory或派生类的实例。 TurbineControllerFactory设置TurbineActionInvoker,负责定位正确的过滤器。

请注意,如果您使用DI容器(Turbine术语中的服务定位器)注册自定义IControllerFactory,则将使用此IControllerFactory类型,如果这不是从TurbineControllerFactory派生,则不会将TurbineActionInvoker的实例分配给创建的Controller - 这意味着永远不会调用您的InjectableFilterAttribute。

配置Turbine应用程序的目的是定义一个派生自TurbineApplication的自定义应用程序类。

举个例子,这是Turbine配置的Global.asax的整个内容:

<%@ Application Codebehind="Global.asax.cs" Inherits="MyApplication" Language="C#" %>

但请注意,没有任何Global.asax.cs。

MyApplication类必须派生自TurbineApplication并正确配置DI容器。这是一种方法:

public class MyApplication : TurbineApplication
{
    static MyApplication()
    {
        ServiceLocatorManager.SetLocatorProvider(() => new WindsorServiceLocator());
    }
}

显然,如果您使用另一个DI容器,可以将WindsorServiceLocator替换为另一个DI容器。

答案 1 :(得分:1)

我有几个问题要问你:

  • 您使用的是哪个版本的MVC? v1还是v2?如果v2是RC或beta2?
  • 你见过Filter Injection sample吗?