StructureMap, кажется, не готов во время конструктора HttpModule - это правильно? - PullRequest
0 голосов
/ 14 декабря 2010

Этот вопрос больше подходит для подтверждения моего диагноза проблемы, с которой мы столкнулись, или для поиска альтернативных объяснений.

У нас есть HTTPModule, который перехватывает каждый запрос к нашему веб-приложению. Его задача - переводить конкретные параметры строки запроса, которые отправляют наши партнеры по интеграции.

Что более важно, он был подключен к StructureMap следующим образом:

public class SomeModule : IHttpModule
{
    public SomeModule()
    {
        ObjectFactory.BuildUp(this);
    }

    public IDependency Dependency { get; set; }
}

Во время предыдущего выпуска казалось, что модуль не внедрялся во время выполнения обработки запроса. Это привело к некоторой (некрасивой) оборонительной проверке, добавленной как:

public class SomeModule : IHttpModule
{
    public SomeModule()
    {
        ObjectFactory.BuildUp(this);
        if (SomeDependency == null) 
        {
            // HACK: Not sure why this corrects the issue!
            Dependency = ObjectFactory.GetInstance<ISomeDependency>();
        }
    }

    public IDependency Dependency { get; set; }
}

Вы заметите комментарий HACK - он решил проблему, но без веской причины.

Ну, этот же модуль был переназначен на другом сайте - и предыдущий хак больше не работал. Посмотрев на это некоторое время, я внес изменение, чтобы переместить вызов StructureMap за пределы конструктора, и вот, он работает.

public class SomeModule : IHttpModule
{
    public IDependency Dependency { get; set; }

    public void IHttpModule.Init(HttpApplication context)
    {
        Initialize();
        // the rest of the code
    }

    private bool _initialized;
    private void Initialize()
    {
        if (_initialized)
        {
            return;
        }

        ObjectFactory.BuildUp(this);
        _initialized = true;
    }
}

Итак, у меня есть несколько вопросов относительно этого поведения:

  • Я подозреваю, что StructureMap не был полностью инициализирован / настроен при вызове конструктора HttpModule - согласен / не согласен, есть понимание?
  • Я не нашел никаких справочных материалов, в которых указано, когда ожидать, что StructureMap будет инициализирован и готов к обслуживанию запросов. Есть ли такая документация?

1 Ответ

0 голосов
/ 14 декабря 2010

Я бы не ожидал, что поведение будет очень предсказуемым, когда вы пытаетесь создать тип в его конструкторе. Многие действия, которые обычно считаются безопасными, не считаются безопасными в конструкторе (например, использование виртуального свойства в классе).

Куда вы переместили код, он выглядит намного лучше, и я бы оставил его там. Если вы не можете заставить контейнер создавать экземпляр самостоятельно (и поэтому вынуждены его создавать), предпочтительным местом для выполнения действия по созданию является какой-либо метод Initialize.

Чтобы ответить на вопрос, который у вас есть в конце вашего сообщения: Разработчик должен определить, когда инициализируется StructureMap. В веб-приложении это почти всегда делается в Global.asax в Application_Start (). В этом случае я ожидаю, что контейнер будет готов, когда ваш модуль будет вызван.

...