目前我正在嘗試使用 Clean Architecture 將遺留應用程式遷移到某些 api。到目前為止,我能夠進行更改,但是每次遇到 DTO 時,我都無法理解如何將其放置在干凈的架構中。通過 DTO,我指的是:包含來自域物體的多個屬性組合的物件。我正在使用 DTO,因為資料庫仍處于“傳統格式”,但 api 必須在多個系統中公開不同格式的回應。
假設我有以下結構:
領域:
public class EntityA
{
public string Prop1{get; set;}
}
public class EntityB
{
public string Prop2{get; set;}
}
然后我有一個服務介面,如下所示:
public interface IService
{
}
在應用層(用例)中,我實作了域中描述的服務和 DTO 本身:
public class DTO
{
public string Prop1{get; set;}
public string Prop2{get; set;}
}
public class Service : IService
{
public IEnumerable<DTO> RetrieveDto()
{
return new DTO()//Construct DTO....
}
}
我的問題開始了。
我需要修改域服務介面以回傳 DTO。這正在生成一個回圈參考,我認為這樣做是不行的。
我試圖在域中創建一個抽象的 DTO 類并從它繼承以避免從域到應用程式的參考。但我不太確定這應該是一個解決方案,因為 DTO 只是存盤資料的物件,我在那個抽象類中沒有任何東西。
目前,映射器和 DTO 放置在應用程式中,因為我從應用程式訪問存盤庫的基礎結構,這里是我將物體映射到 DTO 的地方。
所以我的問題是:我在這里理解錯了嗎?DTO 應該正確放置在哪里?
謝謝!
uj5u.com熱心網友回復:
- 最流行的架構風格:第 1 層 - 物體(物體/模型)=> 您可以將 dto 保存在 DTO 檔案夾中 - 資料訪問(您檢索資料)=> 您可以將 dto 與此處的物體映射 - 業務 => 存盤庫、服務-Core => Helper methods common things -API => Controllers,Communication with fronted aka client
uj5u.com熱心網友回復:
我認為您認為 DTO 與物體如此分離是不準確的。畢竟如果你的用例需要回傳這個資料結構,它就屬于/下的用例。
旁注:我也不喜歡“dto”這個詞,因為它沒有指定任何不尋常的東西。(幾乎所有物件都包含資料并被傳輸)但是對于您的用例:我會將 DTO 重命名為“UseCaseXResponse”,然后將其放在其他物體旁邊。然后,所有物體將包括一些面向輸入的物體,一些面向輸出的物體,也許還有一些通用的物體。將輸入轉換為輸出的邏輯在用例類中。
如果您覺得這種資料聚合在您的業務邏輯中沒有位置,那么您需要將其他物體暴露給外層并使用該外層將回應聚合到 dto 中。
uj5u.com熱心網友回復:
您必須在域層中定義 DTO 以及服務的介面。DTO 本質上是服務介面定義的一部分,沒有它就沒有任何意義。
當您考慮該服務的實作時,在外層中,盡管內部實作不同,但這些實作都將共享回傳該 DTO 型別的能力。
依賴于服務定義介面的領域層方法也依賴于定義的 DTO 作為服務的方法回傳型別。
就像是:
public class Domain.DTO
{
public string Prop1{get; set;}
public string Prop2{get; set;}
}
public interface Domain.IService
{
DTO DoSomething();
}
public class Domain.EntityA
{
public string Prop1{get; set;}
// Super-contrived, but you get the point...
public void DoSomethingWith(IService service)
{
// regardless of the actual implementation,
// I know result will always be DTO-shaped
var result = service.DoSomething();
}
}
public class Application.ServiceOne : Domain.IService
{
public Domain.DTO DoSomething()
{
// Do something one way, but providing the agreed DTO
}
}
public class Application.ServiceTwo : Domain.IService
{
public Domain.DTO DoSomething()
{
// Do something another way, but still providing the agreed DTO
}
}
這維護了架構推動的所有向內傳播的依賴關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/487095.html
