簡體   English   中英

如何減少域/實體/ DTO對象的重復?

[英]How do I reduce duplication of domain/entity/DTO objects?

我正在重新設計我當前的項目以使其更易於維護,並盡力遵循良好的設計實踐。 目前我有一個Silverlight組件的解決方案,用於所述SL應用程序的ASP.Net主機,該應用程序還包含WCF RIA服務和共享類庫,因此SL和WCF服務都可以共享對象。 業務邏輯遍布各處,所有CRUD操作都在我的WCF服務中手動編碼。 所以,我正在為一切創建一個新結構,並將這個混亂移植到新格式中。 在這樣做的過程中,當我不知道自己是否應該這樣時,我發現我正在復制課程。

我的新結構如下:

客戶:
Reporting.Silverlight = Silverlight應用程序。 這將參考我的DTO課程。
Reporting.Web =持有我的SL應用程序,是人們進入它的主要入口點。

商業:
Reporting.Services =我的WCF服務就在這里。 我的SL應用程序將調用此方法來執行操作,這些服務將返回DTO類。
Reporting.Services.Contracts =保存我的WCF服務接口,並包含帶有DataContract裝飾器的DTO類。
Reporting.Domain =保存我的域對象和業務邏輯

數據:
Reporting.Data.Contract =保存我的存儲庫和工作單元的接口
Reporting.Data =存儲庫/ UoW的具體實現。 此處定義了Entity Framework 5上下文。
Reporting.Data.Models =保存我的所有Entity對象,以便EF5可以用SQL做它的事情。

我有3個地方,我幾乎完全相同的課程,對我來說它聞起來。 Reporting.Services.Contracts內部,我有一個DTO,可以交給SL客戶端。 這是一個例子:

[DataContract(Name = "ComputerDTO")]
public class ComputerDTO
{
    [DataMember(Name = "Hostname")]
    public string Hostname { get; set; }

    [DataMember(Name = "ServiceTag")]
    public string ServiceTag { get; set; }

  // ... lots more
}

我認為上面的DTO很好,因為它只是傳遞給SL客戶端的一堆屬性。 我的DTO屬性的絕大多數都映射到我的實體對象1:1的特性,除了ID字段。 這是我的Entity對象,與上面的DTO對應:

[Table("Inventory_Base")]
public class ComputerEntity
{
    // primary key
    [Key]
    public int AssetID { get; set; }

    // foreign keys
    public int? ClientID { get; set; }

    // these props are fine without custom mapping
    public string Hostname { get; set; }
    public string ServiceTag { get; set; }
    // ... plus a bunch more in addition to my navigation properties
}

我正在使用EF5的代碼優先方法。 我仍處於重寫的最初階段,到目前為止,我的印象是業務邏輯不應該在我的EF實體中。 DTO也不應該有業務邏輯。 這意味着它進入了我的域模型,對嗎? 好吧,這給了我在Reporting.Domain中的第3個幾乎相同的類

public class Computer
{
   public string Hostname { get; set; }
   public string ServiceTag { get; set; }
   // ... lots more, pretty much mirrors the DTO

   public string Method1(string param1)
   {
       // lots of methods and logic go in here
   }
}

擁有3個幾乎完全相同的課程可能不是正確的方法,可以嗎? 我應該將所有業務邏輯放在EF實體中,然后將結果投影到通過線路傳遞的DTO中嗎? 如果將所有域/業務邏輯塞入EF實體類中是個好主意,那么在結構上我應該將該程序集移動到我的業務層和數據層之外,即使這些對象是保存到我的數據庫的對象? 理想情況下,我試圖在我的數據項目中和業務項目之外保留對Entity Framework的任何引用。 我有大約200個左右的類,我正在移植並將構成我的域,並且我希望一旦我完成重寫,這個東西可以擴展到更多的功能。 任何關於如何構造這個東西並保持干燥的見解將非常感激。

如果它有助於定義我想要做的更好,請告訴我是否應該包含我所遵循的我的存儲庫/單元工作方法。

擁有3個幾乎完全相同的課程可能不是正確的方法,可以嗎?

IMO他們不是“3個幾乎相同的類”,他們不是為了同一個目的。 它們是相同領域概念的多個方面,每個方面都針對特定層的需求而定制。

這是模塊化和明確的關注點分離的代價。 您擁有的端口越多(如Hexagonal Architecture的端口和適配器),您需要的方面越多,您需要做的映射就越多。

一篇很好的文章: http//blog.ploeh.dk/2012/02/09/IsLayeringWorththeMapping/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM