InjectableFilterAttribute никогда не попадает в фильтр - PullRequest
1 голос
/ 22 декабря 2009

На моем базовом контроллере я поместил атрибут Logger. Этот атрибут Logger выглядит следующим образом:

public class LoggerAttribute: InjectableFilterAttribute
{
    public override Type FilterType
    {
        get { return typeof (LoggerActionFilter); }
    }
}

Ctor в этом атрибуте loggerattribute получен, но не получатель FilterType.

Соответствующая часть самого фильтра выглядит так:

public class LoggerActionFilter: IActionFilter
{
    private readonly ILoggerService logger;

    public LoggerActionFilter (ILoggerService logger)
    {
        this.logger = logger;
    }
    <IActionFilter Implementeation>
}

Ктор фильтра также никогда не попадет.

Для подключения моих сервисов и создания экземпляра servicelocator проверьте здесь
Регистрацию ILoggerService можно найти здесь

Что мне не хватает?

Ответы [ 2 ]

1 голос
/ 27 декабря 2009

У меня есть пара вопросов к вам:

  • Какую версию MVC вы используете? v1 или v2? если v2 это RC или бета2?
  • Вы видели образец фильтра для инъекций ?
1 голос
/ 24 декабря 2009

Это должно работать автоматически при условии , что для приложения настроен правильный ControllerFactory.

Насколько я могу судить, это должен быть экземпляр TurbineControllerFactory или производный класс. TurbineControllerFactory устанавливает TurbineActionInvoker, который отвечает за поиск правильных фильтров.

Обратите внимание, что если вы зарегистрируете пользовательский IControllerFactory в своем контейнере DI (Service Locator в терминологии Turbine), вместо этого будет использоваться этот тип IControllerFactory, и если он не является производным от TurbineControllerFactory, он не будет назначать экземпляр TurbineActionInvoker созданный контроллер - это снова означает, что ваш InjectableFilterAttribute никогда не вызывается.

Предполагаемый способ настройки приложения Turbine - определить пользовательский класс приложения, производный от TurbineApplication.

Например, вот полное содержимое настроенного на турбине Global.asax:

<%@ Application Codebehind="Global.asax.cs" Inherits="MyApplication" Language="C#" %>

Однако обратите внимание, что Global.asax.cs не существует.

Класс MyApplication должен быть производным от TurbineApplication и правильно настраивать DI-контейнер. Вот один из способов сделать это:

public class MyApplication : TurbineApplication
{
    static MyApplication()
    {
        ServiceLocatorManager.SetLocatorProvider(() => new WindsorServiceLocator());
    }
}

Очевидно, что вы можете заменить WindsorServiceLocator другим DI-контейнером, если вы используете другой.

...