2012-07-26 120 views
3

之前我打破我的申請,我目前的命名空間是這個樣子:WCF最佳實踐數據協定,共享類和DTO的

CompanyAbc.Core 
CompanyAbc.AppXyz.Web 
CompanyAbc.AppXyz.Business 

的CompanyAbc.Core命名空間包含在所有的應用中常用的代碼我們公司。一個例子是一個名爲「ClientMessage」的類,我們使用它作爲一個容器將消息從一個層傳遞到另一個層(例如,將數據層中的數據保存到數據層時,抽象出並支持顯示成功或錯誤消息UI層)

我們現在將CompanyAbc.AppXyz.Business製作成WCF服務。我的問題是:「分享」(或不共享)這些基礎/共同實體的最佳做法是什麼?

例如,你會:

一)添加[DataContract]屬性直接在CompanyAbc.Core命名空間的類,即使它有無關WCF。

CompanyAbc.Core.Entities 
      ClientMessage.cs 

OR

B)創建一個數據傳輸對象是從CompanyAbc.Core命名空間的精確副本?

CompanyAbc.Core.Entities 
      ClientMessage.cs 
    CompanyAbc.AppXyz.Business.DataContracts 
      ClientMessageDto.cs 

OR

c)其他選擇嗎?

另一個複雜性是我們打算分享這些程序集。但爲了強制解耦,而不是分享程序集/商業實體,你會瘋狂並且做這樣的事嗎?

CompanyAbc.Core 
    CompanyAbc.Core.Shared.Entities 
     ClientMessage.cs 

    CompanyAbc.AppXyz.Web 
    CompanyAbc.AppXyz.Web.Entities 
     ClientMessage.cs --> derives from the Core.Shared, or just duplicate code? 

    CompanyAbc.AppXyz.Business.Entities 
     ClientMessage.cs --> derives from the Core.Shared, or just duplicate code? 
    CompanyAbc.AppXyz.Business.DataContracts 
     ClientMessageDto.cs 

回答

0

這裏是我的命名空間看起來怎麼樣,因爲我用它至今:

ABC.Core 
ABC.Data 
ABC.Business 
ABC.Web; 
ABC.Services (common) 
ABC.Services.DTO (common) 
    ABC.Services.Svc1 
     ABC.Services.Svc1.DTO 
    ABC.Services.Svc2 
     ABC.Services.Svc2.DTO 

在實踐中,你不會喜歡有服務之間那麼多的共享類,因爲他們可能會想要分開其中一個。更好的是彼此獨立,你可以更好地對它們進行版本化,但是確實需要在每個服務的DTO級別中重複一些代碼。許多人使用Automapper將Core類投影到DTO中。

讓我知道你在想什麼。

1

我建議你在你的程序集中製作「層次結構組」,以便使它更簡潔,使用更直觀。例如: (取@learner例子作爲基礎)

ABC.Common (It communicates better the intention) 
ABC.Core 
ABC.Core.Web 
ABC.Core.Windows 
ABC.Services.DataContracts 
ABC.Services.ServicesContracts 

等等......

製作一個清晰的層次結構刺激由開發它的使用,因爲它與之前的組件,與已部署。 查看.NET程序集以供參考。