2

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

例如。

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

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

所以如果我有以下...

ILoggingService

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

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

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

4

3 回答 3

3

我已经使用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,
查尔斯

于 2010-05-11T05:30:31.957 回答
2

您需要编写自己的 IActionInvoker 并进行属性注入。查看Jimmy Bogard 的这篇文章以获取想法。

于 2010-05-11T04:51:53.890 回答
2

是的,可以在 FilterAttribute 上使用依赖注入。但是,不能在 FilterAttribute 上使用构造函数注入。这不是 ASP.NET MVC 的限制,它是所有 .Net 代码的共同点,因为传递给属性构造函数的值仅限于简单类型

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

因此,通常的做法是使依赖项成为过滤器的属性,如@Charlino 的示例中所示。然后,您可以使用属性注入。您可以使用 Ninject 来装饰过滤器属性,如 @Charlino 的示例中所示。或者按照@mrydengren 的建议,您可以在 ControllerActionInvoker 的自定义子类中执行此操作。

于 2012-08-06T12:27:23.670 回答