2013-12-19 3 views
3

Я использую замок windsor 3.1.0.0 для инъекции зависимостей в моем приложении MVC 3.0.Castle Windsor 3.1 Конфигурация PerWebRequestLifestyleModule

Мой контейнер установки для обеспечения контроллеров, как это:

  container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestylePerWebRequest()); 

Это, кажется, работает, как я вижу новый экземпляр контроллера, созданного для каждого запроса. Однако в соответствии с documenation: http://docs.castleproject.org/Windsor.LifeStyles.ashx, я должен также поместить это в моем web.config:

<httpModules> 
    <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor"/> 
</httpModules> 

которых у меня нет. Каково поведение Castle Windsor, если этот модуль отсутствует? (В документации говорится, что для правильной работы на веб-запрос вы должны иметь это в своей веб-конфигурации).

ответ

2

Насколько я понимаю, PerWebRequestLifestyle требует IHttpModule так, что он может контрейлерный выключить в init method и HttpApplication events такого как BeginRequest.

Причина, по которой все, кажется, работает, состоит в том, что модуль был инициализирован, и поэтому PerWebRequestLifestyle работает нормально.

Но почему это так, если вы не включили модуль регистрации? Я подозреваю, что это устаревшая инструкция и что контейнер попытается зарегистрироваться самостоятельно, но это явно не задокументировано.

Если мы заглянем внутрь CastleWindsor, мы найдем что-то под названием Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModuleRegistration. Он имеет этот метод:

public static void Run() 
{ 
    Type type = Type.GetType("Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility, Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", false); 
    if (type == null) 
    { 
     return; 
    } 
    MethodInfo method = type.GetMethod("RegisterModule", BindingFlags.Static | BindingFlags.Public); 
    if (method == null) 
    { 
     return; 
    } 
    object[] objArray = new object[] { typeof(PerWebRequestLifestyleModule) }; 
    method.Invoke(null, objArray); 
} 

Что такое DynamicModuleUtility? Быстрый поиск показывает страницу, написанную K. Scott Allen под названием DynamicModuleUtility.

DynamicModuleUtility позволит вам установить HTTP-модуль в конвейер ASP.NET без внесения каких-либо изменений в файл web.config.

Это только мои предположения о том, что происходит. Вы должны спросить у создателей Castle Windsor подробную информацию о том, как все работает.

+0

Это действительно выглядит так: http://stackoverflow.com/questions/18576350/perwebrequest-and-transient-lifestyles –

Смежные вопросы