2010-09-16 86 views
0

Castle Windsor的感應器機制是否被認爲是實現工作單元模式的有效方式?Castle Windsor攔截器和工作單元

我的項目涉及Castle Windsor,NHibernate Facility,當然還有NHibernate - 全部用於自託管的WCF服務。

每個服務方法通常從Windsor容器請求一個輔助類的實例,WCF調用委託給該輔助類。 Helper類有一個ISessionManager構造函數參數,Windsor通過NHibernate Facility解析。

問題是,助手類正在做太多的工作。它兼有邏輯和數據訪問,這意味着它很難(幾乎不可能)測試和難以閱讀。

我要的是重新安排責任

我不想WCF幫助瞭解交易或會話的任何東西,所以沒有ISessionManager構造阿根廷,交易和沒有引用任何的Isession。

爲了WCF助手做數據訪問,它將不得不依賴一個新的助手,我敢叫它DAO?或上帝禁止存儲庫,其中將是獲取,查詢和可能保存域對象的方法。

從DAO返回NHibernate代理對象的問題是,如果會話在實體返回之前關閉,任何後續嘗試從客戶端代碼訪問域對象上的集合將導致例外,因爲會話是不再用於懶惰地獲取所需的數據。這很明顯,但每個NHibernate新手都必須解決這個問題。

因此,如果DAO和Repos不能關閉會話,那會怎麼樣?

我需要的是每WCF服務操作調用,其中幾個的DAO或Respositories可以調用openSession時,因爲他們喜歡儘可能多的一個NHibernate的會議,但他們都得到相同的會話,理想情況下,任何試圖處置會議將是除非它的最後Dispose被忽略。不確定最後一點,但也許DAOs和repos只是調用ISessionManager.OpenSession,並將其留給其他內容來刷新和處理會話。

我想也許我可以使用一個攔截器,它需要一個ISessionManager,打開一個會話並啓動一個事務,轉發該調用,然後如果沒有發生異常,則提交事務並處理會話,否則回滾事務發生異常。

有什麼想法?

回答

1

因此,如果DAO和Repos無法關閉 會話,會話是什麼?會話是什麼?

服務自己的工作單位,而不是DAO。他們對工作單位進行了界定。

春季管理使用AOP交易,所以攔截聽起來像一個不錯的選擇事務管理給我。

就會話而言,這些都是UI概念,因此它應該是打開會話的Web或桌面UI控制器,編組服務以履行用例,並在會話完成時關閉會話。

相關問題