我一直试图围绕这个类似问题发布的主题:
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
}
答案 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和其他设计模式。通过这种方式,您可以独立于约束技术实施您的横切关注点。