Wir versuchen, Domain-Driven Design in unserem Projekt zum ersten Mal zu übernehmen. Das Problem, das ich habe, ist mit Verbindungen zwischen Entitäten. Wie machst du das richtig?Der richtige Weg, um Assoziationen in DDD zu implementieren?
Say, ich habe die Entitäten und Contract
, eine einfache Eins-zu-viele-Assoziation. Wie modelliere ich es?
Option 1: Aggregat.
Problem: Das Problem hier ist, dass, wenn ich es richtig verstehe, alle Entitäten in einem Aggregat geladen werden müssen, wenn ein Aggregatobjekt erstellt wird. Ich kann keine Lazy-Loads laden, wenn sie benötigt werden, weil es ein Repository von einer Entity referenzieren müsste, was offensichtlich schlecht ist. Es wäre jedoch ein großes Leistungsproblem, alle Verträge eines Mitarbeiters aus der Datenbank zu holen.
Option 2: Holen eines Vertrag des Mitarbeiters durch einen Repository (z.B. ContractRepository.GetContractsForEmployee()
) und das Hinzufügen von EmployeeId
Eigenschaft Contract
Klasse.
Problem: es macht schwer, irgendeine Geschäftslogik in Einheiten zu setzen. Ich hätte gerne eine Methode, sagen wir Employee.Dismiss()
, aber es müsste auch den Vertrag des Mitarbeiters aktualisieren. Dies bedeutet, dass ich diese Logik in einen Dienst stellen müsste. Das Problem ist, ich kann nicht viel Logik denken, die nur auf einem Employee
arbeitet, und so würde das Modell etwas anämisch werden, mit den meisten Logik innerhalb der Dienste.
Wie gehen Sie mit diesen Problemen in DDD um?
Sobald Sie "eine einfache Eins-zu-viele-Verknüpfung" denken, tun Sie nicht DDD, Sie tun Datenbank-Schema-Design. Die Assoziationen zwischen Entitäten sollten Verhalten sein. Ein Mitarbeiter kann sich nicht selbst entlassen, er muss entlassen werden (von einer anderen Stelle, die dazu befugt ist). Option 2 ist die richtige. Sie müssen nicht viel Verhalten für eine Entität entwickeln. Wenn ein Domänenobjekt im realen Geschäft sehr einfach ist, modelliere es so. Es ist wichtig, wie die Domäne das Konzept (die Semantik) definiert und nicht wie viele Methoden das Objekt hat. – MikeSW
MikeSW ist richtig. Ein sehr wichtiger Aspekt von DDD ist Ubiquitous Language. Die Art und Weise, wie Sie über die Domain sprechen, MUSS die Art und Weise sein, wie der Domänenexperte über die Domain spricht, andernfalls wird der Code umständlich und unintuitiv. Es klingt trivial, aber wenn du das richtig machst, beginnen Entitäten, Verhalten vorzuschlagen. z.B. Employee.Resign(); Vertrag.Klicken(); – Asher