是否可以在ASP.NET MVC FilterAttribute上使用依赖注入/ IoC?

时间:2010-05-11 04:44:42

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

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

例如

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

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

如果我有以下内容......

FilterAttribute

并希望添加我的自定义ILoggingService ..我不知道如何。就像,我很容易做到以下几点......

FilterAttribute

但编译错误说明装饰我public class MyCustomFilterAttribute : FilterAttribute { public MyCustomFilterAttribute(ILoggingService loggingService) { ... } } 的属性(上面列出的......)需要1参数 ..所以我不知道该怎么办:(< / p>

3 个答案:

答案 0 :(得分:3)

我的财产注入与NinjectNinject.Web.MVC一起使用。

只要您从Ninject.Web.MVC获得控制器工厂,它就相当简单。

E.g。

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,
查尔斯

答案 1 :(得分:2)

您需要编写自己的IActionInvoker并进行属性注入。请查看Jimmy Bogard撰写的this帖子,了解相关信息。

答案 2 :(得分:2)

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