1

在我的基本控制器上,我放置了该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 的实例化检查这里
ILoggerService 的注册可以在这里找到

我错过了什么?

4

2 回答 2

1

如果为应用程序配置了正确的 ControllerFactory,这应该会自动工作。

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

请注意,如果您使用 DI 容器(Turbine 术语中的服务定位器)注册自定义 IControllerFactory,则将使用此 IControllerFactory 类型,如果这不是从 TurbineControllerFactory 派生的,它不会将 TurbineActionInvoker 的实例分配给创建的控制器- 这再次意味着您的 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 Container,您可以将 WindsorServiceLocator 替换为另一个 DI Container。

于 2009-12-24T15:36:33.357 回答
1

我有几个问题要问你:

  • 您使用的是哪个版本的 MVC?v1 还是 v2?如果 v2 是 RC 还是 beta2?
  • 您看过过滤器注射样品吗?
于 2009-12-27T15:12:09.987 回答