簡體   English   中英

DTO形狀:扁平,復雜/嵌套,或兩者的混合

[英]DTO shape: flat, complex/nested, or a mixture of both

我有一個MVC2 n層應用程序(DAL,域,服務,MVC Web)使用DDD方法(域驅動設計),具有帶存儲庫的域模型。 我的服務層使用請求/響應模式 ,其中請求和響應對象包含DTO(數據傳輸對象)以將數據從一個層封送到下一個層,並且映射通過AutoMapper的幫助完成。 我的問題是: DTO通常采用什么樣的形狀? 它既可以嵌套/復雜的 DTO,還是嚴格來說是平面投影? 或者可能兩者兼而有之? 另外,擁有平面DTO與更復雜/嵌套DTO的主要原因是什么?

例如,假設我有一個域,如下所示:

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Company Company { get; set; }
}
public class Company
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
}

我有三種不同的方法可以對Response對象進行建模。

選項1 - DRYest選項:

public class GetEmployeeResponse
{
    public class EmployeeDTO { get; set; } // contains a CompanyDTO property
}

根據我所做的研究,如上所示,DTO采用與域對象類似的形狀是不合適的。

選項2 - 域的扁平投影(反DRY):

public class GetEmployeeResponse
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string CompanyName { get; set; }
    public string CompanyAddress { get; set; }
    public string CompanyCity { get; set; }
    public string CompanyState { get; set; }
}

這更簡單,就像DTO顯然應該這樣,但最終會產生更多的DTO。

選項3 - 兩者的混合:

public class GetEmployeeResponse
{
    public EmployeeDTO Employee { get; set; }
    public CompanyDTO Company { get; set; }
}

這允許代碼更干燥,可重用和可管理,並且不會將我的域結構暴露給最終用戶。 另一個主要好處是其他響應,比如GetCompanyResponse可以簡單地返回CompanyDTO ,而不必復制所有這些屬性,類似於選項2.你怎么看? 您有哪些選擇(如果有的話)和/或為您工作過? 如果這些請求/響應稍后作為WCF服務方法公開,您的答案是否會改變?

我個人的偏好是嘗試盡可能保持平坦,只傳輸所需的數據。 說過去我曾經使用過深度嵌套的DTO,因為它在當時有意義且符合要求。 所以我猜它歸結為“它取決於”。 在一天結束時,請考慮手頭的應用程序。 沒有必要嘗試將喇叭數據轉換為不符合您要達到的目標的DTO慣例。

暫無
暫無

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

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