Ich versuche, eine allgegenwärtige Sprache auf meine Domänenobjekte anzuwenden.So konvertieren Sie ein DTO zu Domänenobjekten
Ich möchte eine Data Transfer Object
von einem Client in das Domain-Objekt konvertieren. Die Aggregate's Constructor
akzeptiert nur die erforderlichen Felder, und die restlichen Parameter sollten unter Verwendung von aggregate's
API
auch dann weitergegeben werden, wenn die Aggregate
erstellt wird (z. B. CreateAggregate
command
).
Aber der DTO
zu Aggregate
Mapping-Code wird ein wenig chaotisch:
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)
}
//..........
//..........
Eine Sache, die ich erwähnen soll, ist, dass dieses Problem nicht ein domänenspezifisches Problem scheint.
Wie kann ich reduzieren diese If-Else-Anweisungen ohne meine domain internals leakage
zu lassen, und mit sicher zu sein, dass die Aggregat (kein Mapping-Tool) keine Werte annehmen, die es Geschäftsregeln invalide kann, und mit dem allgegenwärtigen mit Sprache angewendet?
Bitte sagen Sie mir nicht, dass ich AoutoMapper
verwenden kann, um den Trick zu tun. Bitte lesen Sie den letzten Teil sorgfältig.
Vielen Dank.
Ihre Antwort ist perfekt, aber Sie wissen 'RegistrantType.Person()' kehrt Enum-Wert von 0 und 'RegistrantType.Company()' kehrt Enum-Wert von 1 in diesem speziellen Fall. Der Grund, warum ich die Nummer nicht in das Aggregat übertragen habe, war, die Interna der Domain nicht zu verlieren. Und wenn ich eine Fabrik in diesem speziellen Fall erstelle, sollte die Fabrik wieder eine Nummer als enum flag abgeben. Und das klingt für mich wie ein implizites und anämisches Modell. – Mohsen