Можно ли использовать инъекцию зависимости / IOC на ASP.NET MVC Filterattribute?

StackOverflow https://stackoverflow.com/questions/2808137

Вопрос

У меня простой обычай FilterAttribute которые я использую украсить различные ActionMethods.

например.

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

Теперь я хочу добавить какую-то вход на это действие по настройке .. поэтому быть хорошим мальчиком, я использую DI/IoC ... и как такое желание использовать этот шаблон для моего обычаемого FilterAttribute.

Так что, если у меня есть следующие ...

ILoggingService

и хочу добавить это мой обычай FilterAttribute ... Я не уверен, как. Вроде, мне легко сделать следующее ...

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

Но ошибки компилятора говорят атрибут, который украшает мой ActionMethod (вышеперечисленное...) требует 1 аргун .. так что я просто не уверен, что делать :(

Это было полезно?

Решение

У меня есть имущественная инъекция, работающая с Ниinject. и то Ninject.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...
    }
}

Он имеет недостаток, по сути, имея «скрытую» зависимость, так сказать ... но не так много, что вы можете сделать с этим.

Хет,
Чарльз

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top