2

我有一个简单的自定义FilterAttribute,我用它来装饰各种ActionMethods是否可以在ASP.NET MVC FilterAttribute上使用依赖注入/ IoC?

例如。

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

现在,我想一些记录添加到这个CustomFilter行动..所以是一个好孩子,我使用DI/IoC ......,因此希望使用此模式为我定制FilterAttribute

所以,如果我有以下的...

ILoggingService 

,并希望增加这是我的自定义FilterAttribute ..我不知道怎么样。像,很容易让我做下面...

​​

但是编译器错误说法,其中装饰的属性我ActionMethod(以上所列...)要求1 ARG ..所以我只是不知道该怎么办:(

回答

3

我有物业注射Ninject和工作Ninject.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,
查尔斯

2

你需要编写自己的IActionInvoker,做财产注射。有想法看看this后吉米·博加德。

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