2013-12-19 107 views
3

我在我的MVC 3.0應用程序中使用castle windsor 3.1.0.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的行爲是什麼? (文檔中說,爲了使每個Web請求正常運行,您必須在您的Web配置中具有此功能)。

回答

2

據我瞭解,在PerWebRequestLifestyle需要IHttpModule,以便它可以背馱式關閉init methodHttpApplication eventsBeginRequest

一切似乎工作的原因是因爲該模塊已被初始化,所以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將允許您在不對web.config文件進行任何更改的情況下將HTTP模塊安裝到ASP.NET管道中。

這只是我的猜測,究竟是怎麼回事。您必須向Castle Windsor的創作者詢問具體情況。

+0

這確實是這樣的情況:http://stackoverflow.com/questions/18576350/perwebrequest-and-transient-lifestyles –