2009-10-22 23 views
2

我有一個POCO類,我正在使用NHibernate在WCF服務層。我正在考慮嘗試將NHibernate代理類發送到客戶端。這是我控制的客戶端。我們使用全系統預留來處理記錄更新,因此在任何給定時間只能向客戶發送一個此實體的可寫副本。我的基本目標是利用NHibernates更改跟蹤功能,因此我不需要從數據庫獲取副本並重播客戶端爲更新數據庫所做的更改。與向客戶端發送Hibernate代理類相關的問題有什麼問題

假設我能得到這個工作有什麼缺點這個接近?

+1

如果您完全理解WCF的基本機制,我並不是100%確定的:您所做的只是將對象序列化爲**消息**併發送該消息。這意味着:您只能發送實際的具體數據 - 沒有行爲,沒有界面,沒有泛型。另一方面,你沒有得到「同一個對象」 - 對象正在被髮送的數據重新組合。如果這將保留一個NHibernate代理中的所有狀態信息 - 我非常懷疑它! – 2009-10-22 16:23:53

回答

2

懶惰加載會給你最大的頭痛。

對象的一些屬性將包含附加到ISession的NHibernate代理。所有這些都會回傳給客戶。當客戶端試圖反序列化你的對象時,代理被調用並嘗試檢索更多的數據。繁榮!

有幾種解決方法的人已經發布(谷歌 「NHibernate的WCF」 或 「NHibernate的WCF懶加載」):

http://lunaverse.wordpress.com/2007/05/09/remoting-using-wcf-and-nhibernate/

http://timvasil.com/blog14/post/2008/02/WCF-serialization-with-NHibernate.aspx

http://whiletrue.nl/blog/?p=37

http://trentacular.com/2009/08/how-to-use-nhibernate-lazy-initializing-proxies-with-web-services-or-wcf/

我目前正在使用自定義的替代代理,所以他們做了一個WCF調用,而不是觸發Nhibernate延遲加載。

+0

我喜歡使用WCF的代理的想法,我喜歡有一個使用wcf而不是客戶端數據庫的ISession的想法。 – 2009-10-22 15:29:52

+0

有人試圖這樣做,但這個人放棄了它:http://slagd.com/?p=4 – 2009-10-22 16:14:06

4

我不打算從具體技術的角度來回答這個問題,但我希望您能夠在做出某些決定時發現這種觀點。你應該保持你的實體類型是內部的,因此,與你的服務類型(又名值類型)是分開的。無論如何,很多時候實體對於服務接口來說太細緻了。例如,您可能想要返回來自服務層的操作的結果,該操作實際上是實體模型中不同部分數據的組合。不僅如此,並非一個實體的所有領域都必須被客戶直接修改。另外,如果你直接暴露你的entitiy類型,你就有可能將自己嫁給潛在的數據庫結構,而這些數據庫結構在一段時間內可能需要通過可擴展性的原因進行重構。通過將您的服務的價值類型與填充它們的基礎實體分離,您可以爲自己提供一個可伸縮的靈活性層。

不足之處是你正在編寫很多值類型,它們通常看起來很像數據訪問層中的實體類型,它們基本上是服務域內的「空殼」。另外你需要映射函數來在這兩種類型之間來回轉換值。對我來說,這是一筆小小的代價,用於支付隨時可用的靈活性。

+0

謝謝,這兩個應用程序是如此緊密結合在一起的,客戶端和服務器上的域對象實際上是相同的。 – 2009-10-22 15:26:58