Die Art und Weise, wie Sie die Frage stellen (und zwei Alternativen vorschlagen), ist, als ob die einzige Sorge darin besteht, dass die Fahrer-ID zum Zeitpunkt der Erstellung des Autos noch gültig ist.
Sie müssen sich jedoch auch Sorgen machen, dass der mit driverId verknüpfte Fahrer nicht gelöscht wird, bevor das Auto entweder gelöscht oder einem anderen Fahrer zugewiesen wurde (und möglicherweise auch, dass der Fahrer keinem anderen Auto zugewiesen ist (dies, wenn die Domäne einen Fahrer nur darauf beschränkt) mit einem Auto verbunden sein)).
Ich schlage vor, dass Sie anstelle der Validierung zuweisen (was die Validierung der Anwesenheit einschließen würde). Sie werden dann Löschungen verbieten, solange sie noch zugewiesen sind, und so den Race-Zustand veralteter Daten während der Erstellung sowie das andere längerfristige Problem schützen. (Beachten Sie, dass die Zuordnung sowohl validiert als auch zugewiesene Markierungen enthält und atomar arbeitet.)
Übrigens stimme ich @PriceJones zu, dass die Verbindung zwischen Auto und Fahrer wahrscheinlich eine Verantwortung ist, die entweder vom Auto oder vom Fahrer getrennt ist. Diese Art der Zuordnung wird mit der Zeit immer komplexer, da es sich um ein Planungsproblem handelt (Fahrer, Autos, Zeitfenster / Fenster, Ersatz usw.). Auch wenn es sich eher um ein Registrierungsproblem handelt, möchte man möglicherweise ein historisches Problem Registrierungen sowie aktuelle Registrierungen. Somit kann es sehr wohl sein eigenes BC direkt verdienen.
Sie können ein Zuordnungsschema (z. B. einen Booleschen Wert oder einen Referenzzähler) innerhalb des BC der zugewiesenen Aggregatentitäten oder innerhalb eines separaten BC bereitstellen, z. B. derjenigen, die für die Zuordnung zwischen Auto und Fahrer verantwortlich ist. Wenn Sie das erstere tun, können Sie (gültige) Löschvorgänge zulassen, die an das Auto oder den Fahrer BC ausgegeben werden. Wenn Sie Letzteres tun, müssen Sie Löschungen aus den Auto- und Fahrer-BCs verhindern und diese stattdessen über den Planer der Auto- und Fahrerassoziation senden.
Sie können auch einige der Zuweisungsverantwortlichkeiten wie folgt auf die BCs aufteilen. Der Auto- und Fahrer-BC stellt jeweils ein "Zuordnungsschema" bereit, das den zugewiesenen Booleschen Wert mit diesem BC validiert und festlegt. Wenn ihr Zuordnungs-Boolescher Wert festgelegt ist, verhindert der BC das Löschen der entsprechenden Entitäten. (Und das System ist so eingerichtet, dass die Auto- und Fahrer-BC nur die Zuweisung und Freigabe von der Auto- / Fahrerassoziationsplanung BC zulässt.)
Das Auto- und Fahrerplanungs-BC verwaltet dann einen Kalender mit Fahrern, die für einige Zeiträume / Zeiträume jetzt und in Zukunft mit dem Auto verbunden sind, und benachrichtigt die anderen BCs über die Freigabe nur bei der letzten Verwendung eines geplanten Autos oder Fahrers.
Als radikalere Lösung können Sie die Auto- und Fahrer-BCs als reine Anhänge-Fabriken für historische Aufzeichnungen behandeln und das Eigentum dem Planer der Auto- / Fahrervereinigung überlassen. Das Auto BC kann ein neues Auto mit allen Details des Autos zusammen mit seiner Fahrgestellnummer generieren. Das Eigentum an dem Auto wird vom Planer der Auto- / Fahrervereinigung übernommen. Selbst wenn eine Auto- / Fahrervereinigung gelöscht und das Auto selbst zerstört wird, sind die Autoaufzeichnungen per Definition im Auto-BC vorhanden, und wir können das Auto-BC verwenden, um historische Daten nachzuschlagen. während Auto- / Fahrerverbände / -eigentümer (Vergangenheit, Gegenwart und möglicherweise zukünftige geplante) von einem anderen BC verwaltet werden.
Driver.delete
sollte nicht existieren. Ich habe nie wirklich eine Domain gesehen, in der Aggregate zerstört werden. Wenn Sie ARs in der Nähe halten, können Sie niemals mit Waisenkindern enden.Es könnte hilfreich sein zu fragen: Sind Sie sicher, dass Autos mit Fahrern gebaut werden? Ich habe noch nie von einem Auto gehört, das aus einem Fahrer in der realen Welt besteht. Der Grund, warum diese Frage wichtig ist, liegt darin, dass sie Sie möglicherweise in die Richtung weist, Autos und Fahrer unabhängig voneinander zu erstellen und dann einen externen Mechanismus zu erstellen, der einen Fahrer einem Auto zuweist. Ein Auto kann ohne Fahrerreferenz existieren und dennoch ein gültiges Auto sein.
Wenn ein Auto unbedingt einen Fahrer in Ihrem Kontext haben muss, sollten Sie das Builder-Muster berücksichtigen. Dieses Muster wird dafür verantwortlich sein, dass Autos mit vorhandenen Fahrern gebaut werden. Die Fabriken werden unabhängig validierte Autos und Fahrer bedienen, aber der Hersteller wird sicherstellen, dass das Auto die Referenz hat, die es benötigt, bevor es das Auto bedient.
quelle
Ich glaube schon. Das Abrufen einer bestimmten Treiber-ID aus der Datenbank gibt einen leeren Satz zurück, wenn dieser nicht vorhanden ist. Wenn Sie also das Rückgabeergebnis überprüfen, müssen Sie nicht mehr fragen, ob es vorhanden ist (und dann abrufen).
DriverId
und im Konstruktor festgelegt ist.Car
nur das brauchtDriverId
, hab einenDriver.Id
Getter. Kein Setter.Car
kümmert es, ob es eineDriver
(oder zumindest seine ID) hat. ADriver
kümmert es, wenn es eine hatDriverId
. DasRepository
kümmert sich um die Datenintegrität und könnte sich nicht weniger um fahrerlose Autos kümmern.DriverId
eine Geschäftsdomänensache ist, wird in den entsprechenden Klassen behandelt.... passiert, wenn
Repository.DriverIdExists()
die Frage gestellt wird.Erstellen Sie ein Domänenobjekt. Wenn nicht,
Driver
dann vielleicht einDriverInfo
(nur einDriverId
undName
, sagen wir) Objekt. DasDriverId
wird beim Bau validiert. Es muss existieren und der richtige Typ sein, und was auch immer. Dann ist es ein Problem beim Entwurf von Clientklassen, wie mit einem nicht vorhandenen Treiber / einer nicht vorhandenen Treiber-ID umgegangen werden soll.Vielleicht
Car
ist a ohne Fahrer in Ordnung, bis Sie anrufenCar.Drive()
. In diesem Fall stellt dasCar
Objekt natürlich seinen eigenen Zustand sicher. Ich kann nicht ohne fahrenDriver
- na ja, noch nicht ganz.Sicher, haben Sie eine,
Car.DriverId
wenn Sie es wünschen. Aber es sollte ungefähr so aussehen:Nicht das:
Jetzt
Car
müssen sie sich mit allenDriverId
Gültigkeitsfragen befassen - ein Verstoß gegen das Prinzip der einzigen Verantwortung; und redundanter Code wahrscheinlich.quelle