1

簡單的問題,我敢打賭一個不是那麼簡單的答案。流利的地圖程序集/實體在運行時

想象一個像Wordpress這樣的項目。 Wordpress的基礎非常好,開發人員使用小部件或插件來構建它。

現在,請考慮NHibernate,特別是Fluent Mappings。

把它們放在一起,你有一個偉大而穩定的「基礎」系統,但你如何加載從外部程序集呈現的映射?我意識到系統將不得不使用反射來加載組件,但是如何在首次運行時順利配置nHibernate,以便意識到從這些組件中加載了額外的實體?你如何參考他們?

我知道你可以在配置完成後在運行時添加Mappings,而且你必須重新創建SessionFactory。這就是爲什麼我想在運行時加載所有必需的實體。

我也知道這可以通過Dependancy Injection略微實現,但我不想走那條路,也不想隨身攜帶這種極端的包袱。

如果普通的舊nHiberante配置文件可以修改,然後在運行時引用,以反映新的實體我只能假設必須有一種方法可以流利地做到這一點。

此外,根據答案:您是否從基礎項目或數據訪問程序集進行配置?

感謝您的幫助。

+0

「隨身攜帶的極度包袱」我可以問你指的是什麼極端的包袱嗎?也許我可以幫助你更好地理解IoC容器。 – 2012-02-29 20:08:09

+0

我當然想更好地理解它們。大多數文檔最多都是稀疏的,專爲軟件大師設計,他們只是不回到基礎或忽略需要的中間代碼。我會很感激。我之前確實和Castle有過一個混亂,但是花了我兩天的時間纔將它啓動並運行,因爲這些文檔並不完整,只是發現我無法繼續使用Castle來完成我的預期項目。我確實得到了它的主旨,爲什麼它是巨大的有用的,但我擔心一些項目是過分的,但如果我更好地理解它,我會認爲不然。 – Anthony 2012-02-29 20:17:20

回答

4

您可以將NHibernate配置對象傳遞給Fluently.Configure()。這樣你可以更新配置。你需要重新創建會話工廠,就像你說的那樣。

可以掃描在bin文件夾中的組件爲包含流利映射類組件(Assembly.Load,然後檢查

Assembly.GetExportedTypes() 
     .Any(x => x.IsClass 
       && !x.IsAbstract 
       && typeof(IMappingProvider).IsAssignabledFrom(type)) 

或類似的),並添加組件。掃描所有組件時,(重新)創建會話工廠。我寫了一個可擴展的應用程序框架(雖然我已經從Fluent NHibernate移動到NHibernate映射的代碼,但原則是相似的),我做了類似的事情。

+0

你能解釋一下「NHibernate通過代碼映射」是什麼意思嗎?這是否與Fluent類似? – Anthony 2012-02-29 20:18:08

+0

NHibernate 3.2自帶了一種內置的方式來使用代碼而不是XML/attributes來映射類,並按照慣例自動映射類。其目的與FluentNHibernate類似,但語法有點不同。我不會說這一定會更好,但我想轉向NH 3.2並減少外部依賴的數量。 FNH有點落後於NH,目前僅支持NH 3。1(正式)。查看http://stackoverflow.com/questions/5777898/docs-examples-for-nhibernate-3-2-mapping-by-code – 2012-02-29 21:14:41

+0

太棒了,我沒有意識到那裏。考慮到我只從Fluent開始,我可能會研究它。我假設我的初始查詢可以按照上面提到的類似方式完成?這也意味着要從基礎項目,web應用程序來完成,或者可以從「中間」程序集(例如數據訪問程序集)完成。 – Anthony 2012-02-29 23:51:42

相關問題