2012-10-18 48 views
3

我正在做一個使用NHibernate的持久性類庫的單元測試。 NHibernate使用Sqlite內存數據庫進行測試。在正常情況下,很容易讓StructureMap爲我啓動一個會話。但是,因爲我使用內存數據庫來提高測試速度,所以我需要在測試期間有一個會話可用(因爲它會在創建新數據庫時將數據庫吹走)。還有另一個皺紋。目前正在燃燒我的情況是測試一個基於NHibernate的自定義ASP.NET成員資格提供程序。這些顯然是每個AppDomain創建的,所以我不應該注入會話到其中,原因很明顯。NHibernate,Sqlite,缺少表和IOC樂趣

有沒有一種方法在結構圖中告訴它擺脫特定類型的實例,同時仍然保持指示如何實例化該類型的位?真的,如果我能擺脫它,我會讓它像HttpScoped對象的生命一樣行事,但顯然我只能在Http請求的上下文中做到這一點。是否有一種直接的方法來手動控制結構圖中出來的對象的生命週期?

我對此的長度以及這是一個愚蠢的問題的可能性表示歉意。我是這個項目的獨奏者,所以我沒有任何人可以從中反彈出一些想法。

回答

1

您可以將會話包裝在您自己的ISession實施中,該實施委託給您控制的實時會話。然後註冊你自己的ISession作爲實例。

+0

我打算將你的標記標記爲修正,因爲這是將我引導到我需要的想法的想法,下面我將對此進行解釋。 –

0

我最終爲我的提供者製作了兩個構造函數,並且使用了一個類型爲Func的私有變量。默認情況下,它的值被設置爲使用StructureMap的ObjectFactory創建會話的標準代碼。

重載的構造函數接受爲參數Func類型的對象。這樣,如果需要的話,我可以注入一個創建該類型實例的策略,但是不必經過任何擴展的努力。在我的測試中,我使用NUnit設置方法創建了會話並在拆解中將其銷燬。我不喜歡這個想法,但我現在不討厭它足以把它撕掉......但是。

這消除了我在表格中遇到的錯誤。但是,由於某種原因,NHibernate似乎無法在我創建的條件下寫入內存中的sqlite數據庫。我現在正在測試以查看是否可以在文件系統中寫入一個。這並不理想,但在寫入磁盤的性能真的開始受到傷害之前,這將是一段很長的時間(我希望)。