2011-01-08 98 views
1

我們有一個典型的多層/層結構。應用程序+ WCF服務+存儲庫/ EF4 /數據庫。跨層/層處理對象圖的最佳方法是什麼?

我們正在使用定製版本的EF POCO T4模板來生成我們的實體,我們使用跨層/層。由於涉及額外的時間/工作,我們決定不使用DTO。

一個示例對象可能是一個森林,它可能具有可能具有樹葉導航屬性的樹的導航屬性。

什麼是最好的方法來添加葉子和處理對象圖?數據是從客戶端導入的,所以我們不一定知道數據庫中是否存在父林/樹。

  1. 查詢服務,並獲取任何現有的相關對象。爲相關對象附上圖形或創建新對象並在客戶端附上圖形。 例如:公共森林GetForest(字符串forestid) 然後---公共無效AddLeaf(葉葉)

  2. 創建森林,樹,和葉在客戶端對象和附加圖表。發送葉對象然後在服務器端執行邏輯以將對象與數據庫中的現有對象進行比較。根據需要剝離圖形,添加不存在的項目和/或附加到現有對象。 示例:public void AddLeaf(葉子葉)

  3. 在客戶端創建林,樹和葉對象,但不附加圖形。將對象發送到服務端,然後執行邏輯以將對象與數據庫中的現有對象進行比較。添加不存在的項目和/或附加到現有對象。 例如:公共無效AddLeaf(葉葉子,樹樹,森林林)

問題歸結爲邏輯應該在哪裏發生附上這些相關對象的圖形。 在一個側面說明中,當處理被序列化和反序列化的圖時,我有點擔心導航屬性的「修正」邏輯。看起來這可能會成爲一個昂貴的運營。

注意:客戶端應用程序是一個正在導入數據的Windows服務...因此它不一定是輕量級客戶端。 (我們不一定害怕增加邏輯。)

+0

使用DTO的:通過層間的對象圖有時似乎是個好主意,但它會導致頭痛! – 2011-01-08 06:18:08

+0

我認爲我們對我們的架構下一個改造,我們將結合的DTO,而是尋找一種方式,在一定程度上自動執行像automapper。 – 2011-01-09 01:19:45

回答

1

我幾個月前有類似的question。在玩了很多這個問題之後,我最後的決定是使用你的第三個解決方案(我的客戶永遠是Web應用程序)。這個解決方案需要編寫大量的代碼,並且它包含一些額外的數據庫查詢,因爲每次您想更新對象時,都必須首先加載整個對象圖。原因是,在使用分離對象時,您必須處理change tracking manually

當您使用第三種解決方案時,您也可以使用DTO並僅在客戶端和服務器之間傳輸真正需要的數據。

如果有狀態客戶端(使用.NET或Silverlight編寫的Windows應用程序),也可以使用自我跟蹤實體和第一種方法。自我跟蹤實體是Changeset模式的實現。他們可以跟蹤從上下文分離後的所有更改,但必須先從DB加載實體。對於非.NET客戶端使用的Web應用程序客戶端或服務,自追蹤實體爲not a good choice

相關問題