我試圖將無處不在的語言應用於我的域對象。如何將DTO轉換爲域對象
我想將來自客戶端的Data Transfer Object
轉換爲域對象。 Aggregate's Constructor
只接受所需的字段,並且即使在創建Aggregate
(例如CreateAggregate
command
)時,也應該使用aggregate's
API
來傳遞其餘參數。
但DTO
到Aggregate
映射代碼變得有點凌亂:
if(DTO.RegistrantType == 0){
registrantType = RegistrantType.Person()
}
elseif(DTO.RegistrantType == 1){
registrantType = RegistrantType.Company()
}
//.....
//.....
var aggregate = new Aggregate(
title,
weight,
registrantType,
route,
callNumber,
)
//look at this one:
if(DTO.connectionType == 0){
aggregate.Route(ConnectionType.InCity(cityId))
}
elseif(DTO.connectionType == 1){
aggregate.Route(ConnectionType.Intercity(DTO.originCityId,DTO.DestinationCityId)
}
//..........
//..........
有一件事我應該提到的是,這個問題似乎並沒有一個特定領域的問題。
我怎樣才能減少而不讓我domain internals leakage
這些if-else語句,並與被確認合計(不映射工具)不接受,可以invalide它的業務規則的值,並用具有無處不在語言適用?
請不要告訴我,我可以使用AoutoMapper
來伎倆。請仔細閱讀最後一部分。'
謝謝。
你的答案是完美的,但你知道'RegistrantType.Person()'返回枚舉值0,而'RegistrantType.Company()'在這個特定情況下返回枚舉值1。我沒有把這個數字加入到彙總中的原因是爲了避免泄漏域的內部。如果我在這個特定情況下創建一個工廠,工廠應該再次返回一個數字作爲枚舉標誌。這聽起來像是一個隱含的和貧乏的模型給我。任何建議? – Mohsen