2010-05-28 45 views
0

我正在構建一組生成辦公室打開xml基礎報告的類庫,我使用的是靜態Windsor IoC容器。我怎樣纔能有一個Windsor IoC容器可以在我的班級之間共享,但不能在多個Web請求之間共享?

我的問題是,報告系統的一個可能入口點是通過Web前端,這意味着報告系統靜態IoC容器正在多個Web請求之間共享,導致對於每個新請求報告系統的異常嘗試重新註冊已在先前請求中註冊的Windsor組件。

我不想將註冊移動到web應用程序global.asax,因爲我的報告系統將不再是獨立的。

我怎樣纔能有一個Windsor IoC容器可以在我的報告類中共享,但不能在多個Web請求間共享?

+0

請勿使用靜態服務定位器。這是一種反模式,你現在正在經歷一個固有的問題。這應該會導致你認真地重新考慮你的設計 - 也許在這個方向上:http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657 – 2010-05-28 08:50:51

回答

2

不要一遍又一遍重新創建容器。按照您的應用程序在全局起點創建和設置一次。您仍然可以通過封裝installers中的所有註冊來使您的組件自成一體。然後在global.asax中,您將只安裝相當容易的安裝程序,在即將到來的Windsor 2.5中,它實際上是兩行代碼。

+0

此選項爲+1。我不熟悉它。 – Ikaso 2010-05-28 10:19:13

+0

謝謝,安裝程序的想法很好地工作,但我仍然不得不使用靜態數據將容器傳遞給安裝程序類可訪問。 – 2010-05-28 11:57:29

+0

@Si - 你不需要在Windsor 2.5中 - 你可以直接寫:'container.Install(FromAssembly.Named(「YourAssembly」))'' – 2010-05-28 19:05:34

1

您是否嘗試過生活方式選項爲您的組件。有一個PerWebRequestLifestyleManager和一個PerWebRequestLifestyleModule選項。請參閱here生活方式的文件。並參見使用生活方式選項的示例here

+0

mmm並不意味着報告應用程序「知道」它是從Web應用程序調用的?或者,也許這不重要,如果它不是它仍然會很高興。 – 2010-05-28 09:27:47

+0

這是你放在城堡配置中的東西。你的報告應用程序可以隨你想要的配置而來。當報告在Web應用程序內運行時,配置將更改爲使用perwebrequest選項。請注意,您也可以通過編程來配置容器。因此,如果報告模塊以編程方式配置容器,則需要進行一些重構,以便報告模塊對容器配置無動於衷。 – Ikaso 2010-05-28 10:17:12

相關問題