2011-10-28 36 views
3

我們正在開發一個WPF客戶端的3層應用程序,它通過WCF與BLL進行通信。我們使用EF來訪問我們的數據庫。 我們一直使用EF的默認EntityObject代碼生成器,但在通過線路發送這些對象時以及在BLL中處理並重新附加它們時,存在很多問題和序列化問題。EF與POCO + WCF + WPF。在客戶端重用POCO類還是使用DTO?

我們即將切換到POCO模板,並重寫數據訪問和我們的應用程序的通信部分(我們希望有一個更清潔的體系結構和較少的「魔碼」的方式。

我的問題在客戶端重用POCO類是否是一個好主意?還是應該創建單獨的DTO類?即使它們與POCO實體類相同?這兩種方法的優缺點是什麼?

+1

檢查這個答案,以及如何避免把EF實體依賴於上述DAL層:http://stackoverflow.com/questions/7474267/mvc3-and-entity-framework/ 7474357#7474357 –

+0

你檢查了一些「相關」的問題嗎?之前有過很多關於這個話題的討論。請參閱http://stackoverflow.com/questions/725348/poco-vs-dto和http://stackoverflow.com/questions/3779508/what-is-the-best-practice-for-sending-data-to-the -client-poco-or-dto – InSane

回答

3

絕對使用DTOs + AutoMapper。否則,由於循環依賴性(尤其是導航屬性的問題),使用WCF時DataContractSerializer會產生大量問題。 h最初可能會省略DTO,但由於上述問題,您將不得不稍後使用它們。所以我會建議爲每一層使用適當的DTO。

此外,您的層特定模型將攜帶不同的屬性。您可能還需要修改(即專門化)您在每個層中執行的數據。因此,如果您的項目足夠大(或有前景如此),請使用具有適當命名的DTO並將它們放置在適當的位置(即不是全部位於同一個組件中)。

+0

即使在我的情況下DTO課程與POCO課程相同,這是你的建議嗎?所以基本上我會開始開發應用程序,創建一個T4模板來從POCO生成DTO。 –

+1

是的,這是我的建議,因爲隨着項目越來越大,它可以幫助您節約大量頭痛。此外,AutoMapper將簡單地將您從所有手動映射麻煩中解脫出來。如果您對DataContractSerializer知識非常有信心,您仍然可以使用POCO's,但需要做大量調整。 –

1

我會說使用DTOs。

循環依賴和大對象圖可能是一個嚴重的問題,導致錯誤或太多的序列化流量。 ORM控制對象上的噪聲太多,無法將其傳送到線路上。

我使用服務層訪問我的域對象並廣泛使用LINQ,但我總是將DTO對象返回給客戶端。

2

現在我在類似的問題上工作。我已經做了下一個:

  1. 創建未來assemplities:

SF.Contracts - 只是定義ServiceCotnracts和DataContracts。顯然,所有的數據合同都可以像EF中的POCO類一樣使用(但我不使用t4或其他生成器 - 所有POCO類和DataContext都是手動編寫的,因爲我需要使用非常簡單的bad database)。 SF。

SF.DataAccessObjects - 在這個assemity中,我實現了我的edmx和DataContext。 SF.Services - WCF服務的實現。

因此,一個大量選擇WCF方法的旁邊簽署和實施:

 public List<Vulner> VulnerSelect(int[] idList = null, string[] navigationPropertiesList = null) 
    { 
     var query = from vulner in _businessModel.DataModel.VulnerSet 
        select vulner; 

     if (navigationPropertiesList != null) 
      navigationPropertiesList.Select(p =>{query = ((ObjectQuery<Vulner>)query).Include(p); 
            return true; }); 
     if (idList != null) 
      query = query.Where(p => idList.Contains(p.Id)); 

     return query.ToList(); 
    } 

,你可以使用這個方法是這樣的:

WCFproxy.VulnerSelect(new[]{1,2,3},new[]{"SecurityObjects", "SecurityObjrcts.Problem"}); 

,這樣,你有沒有問題序列化,導航屬性等,您可以清楚地指出哪些NavigationProperties必須加載。

p.s.:索裏對我的英語不好:)

+0

感謝您的回答。在這個例子中,Vulner類既是您通過WCF的DTO,也是EF管理的實體類,對嗎? –

+0

是嗎?你是對的。 EDMP將我的VulnreTable從數據庫映射到此POCO類,並且該類使用類似於WCF服務上的DataContract。 –