2015-09-09 44 views
0

我正在使用Castle Windsor並嘗試使用LifestylePerWebRequest。但是,我需要使用工廠方法來創建我的對象,所以我有以下注冊。使用PerWebRequest生活方式的工廠方法

Component.For<IMyComponent>() 
     .UsingFactoryMethod(CreateMyComponent) 
     .LifestylePerWebRequest() 

當我把一個斷點CreateMyComponent,我看到了一個請求期間打了好幾次。這似乎不像PerWebRequest生活方式的正確行爲。這兩個不兼容?我在這裏做錯了什麼?

回答

1

嘗試將此項添加到您的Global.asax.cs文件中,以驗證每個Web請求多次調用CreateMyComponent(它不應該):

protected void Application_BeginRequest(object sender, EventArgs args) 
{ 
    System.Diagnostics.Debug.WriteLine(this.Request.RequestType + " " + this.Request.RawUrl); 
} 

在CreateMyComponent方法和Application_BeginRequest方法中都放置一個斷點。調試器應該先停止在Application_BeginRequest方法,然後再停在CreateComponent方法。它不應該再次進入CreateComponent方法,除非它首先進入Application_BeginRequest方法。

也許你有一些ajax或其他資源會產生多個請求「每頁加載」,從而使它看起來像溫莎調用你的工廠方法多次每個Web請求。這會告訴你是否是這種情況。

如果它確實每個HTTP請求多次調用您的方法,那麼可能是因爲其他答案提示缺少配置。

+0

我開始懷疑這種情況。 – cadrell0

+0

只要Windsor根據實際的HTTP請求調用您的方法一次 - 不管該HTTP請求是來自ajax請求,css文件還是其他資源 - 它都按設計工作。單頁面加載可能包含多個HTTP請求,從而導致您的方法被多次調用。這仍然是正確的行爲。 –

+1

是的,我剛剛發現我的應用程序組件中的其他地方正在解析並放置在每個請求的'HttpContext.Current.Items'中。這包括CSS和JS請求。這可能是問題的根源。 – cadrell0

0

城堡自己的documentation使用Web請求生活方式與工廠方法,所以他們應該是兼容的。

該部分的其餘部分繼續討論使用PerWebRequest時的其他注意事項,因此可能值得一讀。特別是:

我們要打開我們的web.config文件,找到它的System.Web部分,並且有添加以下內容:

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

很抱歉,如果這不是太大的幫助!如果你的配置正確,你應該支持它。