asp.NET MVC 2 ActionFilter上的依赖注入/属性注入:帮助!

时间:2011-04-08 22:24:07

标签: asp.net-mvc-2 dependency-injection

我一直试图围绕这个类似问题发布的主题:

Is it possible to use Dependency Injection/IoC on an ASP.NET MVC FilterAttribute?

然而,我只是没有到达任何地方。更不用说,所有解决方案似乎都依赖于其他我无法使用的库(MvcContrib,Unity)。

任何人都可以拼凑一些代码来解释如何使这个属性注入工作吗?或者,如果有另一种方法可以实现这一目标?

非常感谢!

相关代码1:控制器

namespace TxRP.Controllers
{
    [GetMasterPageData] 
    public class BaseController : Controller
    {
    }
}

相关代码2:ActionFilter

public class GetMasterPageData : ActionFilterAttribute
{
    private IEmployee emp; //<--Need to inject!
    private ICache cache;  //<--Need to inject!

    /// <summary>
    /// ActionFilter attribute which inserts the user name, access level and any error/warning messages to the MasterPage
    /// Session variables which are consumed primarily by the LogOnUserControl.
    /// The MasterPage will display any warning or error messages.
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
                 //Code
    }

1 个答案:

答案 0 :(得分:5)

不可能将DI与属性一起使用,因为它们静态编译到您的类中,因此没有任何东西可以注入。有些人可能会告诉你,你可以使用一种静态工厂来获取你的依赖关系,但这不是依赖注入 - 那将是Service Location - which is an anti-pattern

但是,如果您放弃属性的想法,可以将DI与动作过滤器结合使用,但不是特别容易。您需要创建一个自定义IActionInvoker,尽管最简单的方法是从ControllerActionInvoker派生并覆盖其GetFilters方法。这是一个blog post that explains how to do that for error handling - 您应该可以从中推断出来。

当您厌倦了这样做时,我建议您切换到composing cross-cutting concerns out of Decorators和其他设计模式。通过这种方式,您可以独立于约束技术实施您的横切关注点