C# InjectableFilterAttribute从不命中过滤器

C# InjectableFilterAttribute从不命中过滤器,c#,attributes,ioc-container,turbine,C#,Attributes,Ioc Container,Turbine,在我的基本控制器上,我放置了Logger属性。 此日志属性如下所示: public class LoggerAttribute: InjectableFilterAttribute { public override Type FilterType { get { return typeof (LoggerActionFilter); } } } public class LoggerActionFilter: IActionFilter { p

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

public class LoggerAttribute: InjectableFilterAttribute
{
    public override Type FilterType
    {
        get { return typeof (LoggerActionFilter); }
    }
}
public class LoggerActionFilter: IActionFilter
{
    private readonly ILoggerService logger;

    public LoggerActionFilter (ILoggerService logger)
    {
        this.logger = logger;
    }
    <IActionFilter Implementeation>
}
此loggerattribute上的ctor被命中,但FilterType getter未被命中

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

public class LoggerAttribute: InjectableFilterAttribute
{
    public override Type FilterType
    {
        get { return typeof (LoggerActionFilter); }
    }
}
public class LoggerActionFilter: IActionFilter
{
    private readonly ILoggerService logger;

    public LoggerActionFilter (ILoggerService logger)
    {
        this.logger = logger;
    }
    <IActionFilter Implementeation>
}
公共类LoggerActionFilter:IActionFilter
{
专用只读iLogger服务记录器;
公共LoggerActionFilter(iLogger服务记录器)
{
this.logger=记录器;
}
}
过滤器的ctor也不会被击中

有关我的服务的接线和servicelocator的实例化,请检查
可以找到iLogger服务的注册


我遗漏了什么?

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

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

请注意,如果在DI容器(涡轮机术语中的服务定位器)中注册自定义IControllerFactory,则将使用此IControllerFactory类型,如果此类型不是从TurbineController Factory派生的,它不会将TurbineActionInvoker的实例分配给所创建的控制器,这同样意味着您的InjectableFilterAttribute永远不会被调用

配置Turbine应用程序的预期方法是定义从TurbineApplication派生的自定义应用程序类

例如,以下是配置了Global.asax的Turbine的全部内容:

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

显然,如果使用不同的DI容器,您可以用另一个DI容器替换WindsorService Locator。

我有几个问题要问您:

  • 您使用的是哪个版本的MVC?v1还是v2?如果v2是RC还是beta2
  • 你看到那张照片了吗

我不确定我是否正确理解了这一点。你说没有global.asax.cs,但你说Myapplication代码应该存在。我在我的应用程序中使用的是MyMVCapApplication:TurbineApplication,并将该代码保存在我的global.asax.cs中。这是正确的吗?请注意,只有属性有问题。控件和其他类工作正常。AFAICT,在哪个文件中定义MyMVCapApplication类并不重要。重要的是它源于TurbineApplication。您不必在global.asax.cs中使用它,但如果愿意,您可以使用它。根据我对Turbine的了解,如果TurbineActionInvoker连接不正确,只有属性才会受到影响。您可以在此处找到我的TurbineApplication的代码(也更新了OP):您能否通过调试器进入代码,并检查相应的控制器是否分配了TurbineActionInvoker的实例?我指的项目使用MVC v1。我还查看了注入示例,基本上模仿了那里使用的代码,但没有效果。我试着在源代码中链接,这样我就可以理解为什么它不起作用了,但是我也遇到了一些困难,因为你可以在这个问题中理解:你的项目是一个示例项目还是与工作相关?我不介意看一看。也许我们可以用skype上网看看有什么问题。然后把答案贴回这个问题。想法?嗯,我很乐意,但这是一个与工作相关的项目。我的老板对保密模块非常狂热,看到这是我在这家公司的最后几周,我不想做任何傻事;)一旦mvc2的3.5 turbine LIB发布,我也会为我的宠物项目添加一个类似的日志属性。您可以在添加了日志属性的站点上找到上述项目,但由于目前mvcTurbine libs不能与MVC2一起使用,因此无法编译。