有沒有一種方法來取代對NHibernate 2.0.1GA內部使用的Activator.CreateInstance()的調用來構造實體?理想情況下,我想用StructureMap.ObjectFactory.GetInstance()替換它。我可以在NHibernate中將呼叫替換爲Activator.CreateInstance()嗎?
1
A
回答
4
使用構造函數注入不能輕易做到這一點。 NHibernate的內部可能需要創建一個繼承自你的領域類的代理對象,並且延遲加載代碼等被撒在那裏,所以,據我所知,沒有簡單的選項來覆蓋你的對象的構造。
你可以雖然通過編寫一個攔截器,它可以通過屬性設置器注入來爲你創建對象,但它相當容易地使用NHibernate獲得依賴注入。有一個這樣的例子here。這個例子是使用Windsor作爲DI容器,但當然您可以使用StructureMap做同樣的事情 - here are the relevant docs for StructureMap - 查找「將Setter注入應用到現有對象(BuildUp)」的部分。注意:向域模型注入依賴關係往往被視爲設計問題的症狀,許多人避免這樣做,因此在開始編碼之前確保這是您想要做的事情!
1
您可以通過實現IInterceptor並使用Objectfactory.BuildUp在onload方法中進行注入來執行setterinjetion。這很容易實現,setter注入可能不是你想要的。
您可以通過實現您自己的IBytecodeProvider和ReflectionOptimizer來執行構造函數注入。這有點難,但它是可能的!
我不建議在實體中注入東西。在99.9%的情況下,這將導致糟糕的設計,並使您的設計無法形成分層。也許你面對0.01%的情況下,這是正確的事情。這與打字goto語句一樣頻繁。
2
看看this post from Fabio Maulo(目前的NHibernate主管dev),他在幾個月前解決了這個問題。代碼是爲NHibernate 2.1,但我認爲它可以通過刪除IProxyFactoryFactory部分backported到2.0.1GA。
相關問題
- 1. 如何使用cvmGet將我的呼叫替換爲cvGetReal2D?
- 2. 我可以將呼叫連接到角火嗎?
- 3. SIP呼叫的媒體地址可以在呼叫中改變嗎?
- 4. 外焦可以停止呼叫嗎?
- 5. 我可以在內部呼叫路由嗎?
- 6. 我可以使用isKeyInCache並將putIfAbsent方法替換爲ehcache嗎?
- 7. 可以在Android中將Tabhost替換爲圖片嗎?
- 8. 我需要呼叫.htaccess嗎?
- 9. 可以將Inotify和Select呼叫合併?
- 10. 我可以將XSLT轉換爲XML嗎?
- 11. 圖形API:我可以同時進行多個呼叫嗎?
- 12. 我可以同步多個圖像onload呼叫嗎?
- 13. 我可以獲得WCF呼叫者的URL嗎?
- 14. 我可以從終端呼叫grails controller-action嗎?
- 15. 我可以通過ADB設置呼叫轉送設置嗎?
- 16. 我們可以確保本地彈性搜索呼叫嗎?
- 17. 我可以從一個域BL呼叫另一個域DAL嗎?
- 18. 使用Android API,我可以模擬/創建傳入呼叫嗎?
- 19. 我可以在wso2 esb中使用呼叫中介調用Web服務嗎?
- 20. 呼叫/ cc在Lua - 可能嗎?
- 21. 以角度呼叫另一個http呼叫中的http呼叫
- 22. NSubstitute可以檢查表達式爲<T>的呼叫嗎?
- 23. TcpClient - 我可以用它替換嗎?
- 24. 我可以用代碼替換jaxb.properties嗎?
- 25. 我可以用Silverlight替換WPF嗎
- 26. 我可以在LCDS服務呼叫中獲取客戶端的IP地址嗎?
- 27. 我們可以在android中自動執行「呼叫接收」功能嗎?
- 28. 我可以將所有呼叫存根到第一個方法嗎?
- 29. 我可以將谷歌環聊呼叫添加到Google表格嗎?
- 30. 可以將popup.php替換爲Google擴展程序中的popup.html嗎?
建設者注入是可能的 – Paco 2009-04-15 19:00:55