2011-10-28 32 views
0

我有一套流暢的NHibernate約定,其中大多數是獨立的數據庫。然而,有一對夫婦,其是DBMS依賴這樣一個字符串屬性:在流利NHibernate的數據庫特定約定

Public Sub Apply(ByVal instance As IPropertyInstance) Implements IConvention(Of IPropertyInspector, IPropertyInstance).Apply 
    instance.CustomSqlType("VARCHAR2(50 BYTE)") 
End Sub 

真的,我只是用一種慣例這樣一個DB代(即對象第一個發展)。這對Oracle來說工作得很好,但是我希望使用內存中的SQLite數據庫進行單元測試,顯然這個約定不會工作,因爲SQLite沒有VARCHAR2類型。

有沒有人有任何好的建議或參考他們如何配置流利NHibernate在這種情況下。

目前我正在考慮採用一系列獨立於數據庫的通用約定,然後在子目錄/命名空間中依賴這些約定。然後我會有一些配置,允許我指定一個自定義的ITypeSource組件,它可以提取所有通用約定以及與特定DBMS相關的通用約定,例如SqlConventionTypeSource,OracleConventionTypeSource ...

親切的問候, 瑞安。

回答

0

您通常在可執行文件中設置慣例(以及其他流暢配置)。

這意味着您將在GUI中使用不同的流暢配置,您的單元測試以及其他任何正在使用基於服務的服務。

這聽起來像你對你的配置進行了硬編碼,現在正試圖弄清楚如何讓這個「配置器」根據一些有關環境的信息採取不同的行爲。

一個簡單得多的方法是在頂層創建配置,並將其作爲對其任何需求的依賴。這樣你就不會從不同的環境進入相同的代碼路徑。

不管它是什麼取決於NHibernate,將它設置爲接受ISessionISessionFactory作爲構造函數參數或屬性設置器。那麼你不會有這個問題。您甚至可以對其進行嘲諷,以進行實際上不需要查詢數據存儲的測試。

當然,您仍然可以設置任何創建FNH配置的類,以便自己配置,並在配置行中使用條件語句。但通常FNH配置的開頭幾行代碼很少,看起來似乎不值得。只需爲SQL Server,Oracle,SQLite等創建完全獨立的配置即可。這樣,每次進行小的更改時都不需要經常維護它。

+0

感謝Aaronaught的迴應。 –

+0

供參考;我使用Castle.Facilities.NHibernateIntegration庫來配置NHibernate和Windsor IoC。這樣,所有使用NHibernate的服務/演示者都可以使用ISessionManager作爲必需/可選的類依賴項來創建。當我解決一個服務時,Windsor將注入ISessionManager的具體實現。基本上,我並不需要太擔心使用該工具的會話管理(例如,每次請求打開會話),它使我能夠對嘲笑ISessionManager進行良好的單元測試。 –

+0

我可以通過設施IConfigurationBuilder接口修改會話工廠的默認配置,在這裏我使用慣例使用自動映射流暢地配置NHibernate會話工廠。我需要告訴FNH AutoPersistenceModel哪裏可以找到這些約定,因爲它們相當複雜,定義明確且不可能永遠不會改變,所以這些約定很適合重複使用。這回到了我的原始問題,即我的一些約定是DB特定的(即用於生成模式的約定)。 –

相關問題