【问题标题】:InjectableFilterAttribute never hits the FilterInjectableFilterAttribute 永远不会命中过滤器
【发布时间】:2010-12-29 01:15:15
【问题描述】:

在我的基本控制器上,我放置了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 也永远不会被命中。

对于我的服务的接线和服务定位器的实例化检查here
ILoggerService的注册可以找到here

我错过了什么?

【问题讨论】:

    标签: c# attributes ioc-container turbine


    【解决方案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 容器,您可以将 WindsorServiceLocator 替换为另一个 DI 容器。

    【讨论】:

    • 我不确定我是否理解正确。你说没有 global.asax.cs,但你说 Myapplication 代码应该存在。我在我的应用程序中所做的是有一个 MyMVCApplication: TurbineApplication 并将该代码放在我的 global.asax.cs 中。对吗?
    • 请注意,只有属性有问题。控件和其他类工作得很好。
    • AFAICT,在哪个文件中定义 MyMVCApplication 类并不重要。重要的是它源自 TurbineApplication。您不必在 global.asax.cs 中拥有它,但如果您愿意,可以。根据我对 Turbine 的了解,如果 TurbineActionInvoker 未正确连接,则只有属性会受到影响。
    • 您可以在此处找到我的 TurbinApplication 的代码(也更新了 OP):pastebin.com/f529106ea
    • 你能通过调试器单步执行代码并检查适当的 Controller 是否分配了 TurbineActionInvoker 的实例吗?
    【解决方案2】:

    我有几个问题要问你:

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

    【讨论】:

    • 我所指的项目使用 MVC v1。我还查看了注射样本,基本上模仿了那里使用的代码,但无济于事。我尝试在源代码中进行链接,这样我就可以了解它为什么不起作用,但我也遇到了一些困难,因为你可以在这个问题中关注:stackoverflow.com/questions/1952964/…
    • 您的项目是示例项目还是与工作相关?我不介意看看它。也许我们可以 Skype 看看有什么问题。然后将答案发布回这个问题。想法?
    • 嗯,我很乐意,但这是一个与工作相关的项目。我的老板对保密模块很着急,看到这是我在这家公司的最后几周,我不想做任何迟钝的事情;)一旦 mvc2 的 3.5 涡轮机库上线,我将添加一个类似的日志记录属性不过,我的宠物项目也是如此。您可以在beek.googlecode.com/svn/trunk 找到上述项目
    • 添加了日志属性,但由于目前 mvcTurbine 库不能与 MVC2 一起使用,因此它不可编译。
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 2017-04-16
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2011-06-27
    相关资源
    最近更新 更多