代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

是否可以在ASP.NET MVC filterattribute上使用依赖项注入/ioc?

  •  2
  • Pure.Krome  · 技术社区  · 14 年前

    我有一个简单的习惯 FilterAttribute 我用它装饰各种各样 ActionMethods .

    如。

    [AcceptVerbs(HttpVerbs.Get)]
    [MyCustomFilter]
    public ActionResult Bar(...)
    { ... }
    

    现在,我想给这个自定义过滤器操作添加一些日志记录。所以作为一个好孩子,我用 DI/IoC …因此,我希望使用这种模式 过滤属性 .

    所以如果我有以下内容…

    ILoggingService
    

    并希望将此添加到我的自定义 过滤属性 …我不知道怎么做。比如,我很容易做到以下几点…

    public class MyCustomFilterAttribute : FilterAttribute
    {
        public MyCustomFilterAttribute(ILoggingService loggingService)
        { ... }
    }
    

    但是编译器错误地说了修饰我的 ActionMethod (上面列出…) 需要1个ARG …所以我不知道该怎么做:(

    3 回复  |  直到 12 年前
        1
  •  3
  •   Charlino    14 年前

    我有财产注入工作 Ninject 以及 Ninject.Web.MVC .

    只要您从ninject.web.mvc获得控制器工厂,就相当简单。

    例如。

    public class EventExistsAttribute : FilterAttribute, IActionFilter
    {
        [Inject]
        public IEventRepository EventRepo { private get; set; }
    
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //Do stuff
        }
    
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //Do something else if you so wish...
        }
    }
    

    它的缺点是本质上有一个“隐藏的”依赖性,所以可以说…但你没什么办法。

    HTHs
    查尔斯

        2
  •  2
  •   mrydengren    14 年前

    您需要编写自己的IActionInvoker并执行属性注入。看一看 this 由吉米·博加德发帖征求意见。

        3
  •  2
  •   Community Dan Abramov    7 年前

    是的,可以对filterattribute使用依赖注入。但是,不能对filterattribute使用构造函数注入。这不是ASP.NET MVC的限制,而是所有.NET代码的共同点,因为 the values passed into an attributes constuctor are limited to simple types .

    [MyFilter(ILogger logger)] // this will not compile
    public ActionResult Index()
    {
        return View();
    }
    

    因此,通常的做法是使依赖关系 财产 就像在@charlino的例子中一样。然后可以使用属性注入。您可以使用ninject来装饰过滤器属性,如@charlino的示例所示。或者按照@mrydengren的建议,您可以在controllerActionInvoker的自定义子类中执行此操作。