【问题标题】:Is it possible to use Dependency Injection/IoC on an ASP.NET MVC FilterAttribute?是否可以在 ASP.NET MVC FilterAttribute 上使用依赖注入/IoC?
【发布时间】:2010-05-11 04:44:42
【问题描述】:

我有一个简单的自定义FilterAttribute,我用它来装饰各种ActionMethods

例如。

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

现在,我希望在此 CustomFilter 操作中添加一些日志记录。所以作为一个好孩子,我正在使用 DI/IoC ...因此希望将此模式用于我的自定义 FilterAttribute

所以如果我有以下...

ILoggingService

并希望将此添加到我的自定义FilterAttribute .. 我不确定如何。就像,我很容易做到以下几点......

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

但是编译器错误说装饰我的ActionMethod 的属性(上面列出...)需要 1 个参数 ..所以我只是不确定该怎么做:(

【问题讨论】:

    标签: asp.net-mvc dependency-injection inversion-of-control filterattribute


    【解决方案1】:

    我已经使用NinjectNinject.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...
        }
    }
    

    它具有本质上具有“隐藏”依赖关系的缺点,可以这么说……但是您对此无能为力。

    HTH,
    查尔斯

    【讨论】:

      【解决方案2】:

      您需要编写自己的 IActionInvoker 并进行属性注入。请查看 Jimmy Bogard 的 this 帖子以获取想法。

      【讨论】:

        【解决方案3】:

        是的,可以在 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 的自定义子类中执行此操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-31
          • 2011-01-04
          • 1970-01-01
          • 2016-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多