我有一个简单的自定义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>
答案 0 :(得分: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,
查尔斯
答案 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的自定义子类中执行此操作。