我试图将无处不在的语言应用于我的域对象。如何将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