Можно ли использовать Dependency Injection / IoC на ASP.NET MVC FilterAttribute? - PullRequest
2 голосов
/ 11 мая 2010

У меня есть простой пользовательский 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 arg .. поэтому я просто не уверен, что делать: (

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

У меня есть свойство инъекции, работающее с Ninject и Ninject.Web.MVC .

Пока у вас есть фабрика контроллеров от Ninject.Web.MVC, все довольно просто.

1009 * Е.Г. *

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
Charles

2 голосов
/ 06 августа 2012

Да, можно использовать внедрение зависимостей в FilterAttribute. Однако невозможно использовать инъекцию конструктора в FilterAttribute. Это не ограничение ASP.NET MVC, это общее для всего кода .Net, так как значения, передаваемые в конструктор атрибутов, ограничены простыми типами .

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

Таким образом, обычной практикой является сделать зависимость свойством вашего фильтра, как в примере @ Charlino. Затем вы можете использовать свойство инъекции. Вы можете использовать Ninject, чтобы украсить свойство фильтра, как в примере @ Charlino. Или, как предлагает @mrydengren, вы можете сделать это в пользовательском подклассе ControllerActionInvoker.

2 голосов
/ 11 мая 2010

Вам нужно написать свой собственный IActionInvoker и выполнить инъекцию свойства. Посмотрите на этот пост Джимми Богарда для идей.

...