In fast allen Fällen gehören Primärschlüssel nicht zu Ihrer Geschäftsdomäne. Sicher, Sie haben möglicherweise einige wichtige benutzerbezogene Objekte mit eindeutigen Indizes ( UserNamefür Benutzer oder OrderNumberfür Aufträge), aber in den meisten Fällen besteht keine geschäftliche Notwendigkeit , Domänenobjekte offen anhand eines einzelnen Wertes oder Wertesatzes zu identifizieren administrativer Benutzer. Selbst in diesen Ausnahmefällen, insbesondere wenn Sie GUIDs ( Global Unique Identifiers) verwenden , möchten Sie einen alternativen Schlüssel verwenden, anstatt den Primärschlüssel selbst bereitzustellen.
Wenn mein Verständnis von domänengetriebenem Design korrekt ist, müssen und sollten Primärschlüssel nicht offengelegt werden, und es sollte ein guter Befreiungsschlag erfolgen. Sie sind hässlich und verkrampfen meinen Stil. Wenn wir uns jedoch dafür entscheiden, keine Primärschlüssel in das Domänenmodell aufzunehmen, ergeben sich folgende Konsequenzen:
- Datenübertragungsobjekte ( Data Transfer Objects, DTO) , die ausschließlich aus Kombinationen von Domänenmodellen abgeleitet werden, verfügen nicht über Primärschlüssel
- Eingehende DTOs haben keinen Primärschlüssel
Ist es also sicher zu sagen, dass Sie, wenn Sie wirklich rein bleiben und Primärschlüssel in Ihrem Domain-Modell eliminieren möchten, bereit sein sollten, jede Anfrage in Bezug auf eindeutige Indizes für diesen Primärschlüssel zu bearbeiten?
Anders ausgedrückt: Welche der folgenden Lösungen ist der richtige Ansatz, um bestimmte Objekte nach dem Entfernen der PK in Domänenmodellen zu identifizieren?
- In der Lage zu sein, die Objekte, mit denen Sie sich befassen müssen, anhand anderer Attribute zu identifizieren
- Wiederherstellen des Primärschlüssels im DTO; dh die PK bei der Zuordnung von der Persistenz zur Domäne entfernen und dann die PK bei der Zuordnung von der Domäne zur DTO neu kombinieren?
EDIT: Lassen Sie uns dies konkretisieren.
Sagen Sie mein Domain - Modell ist , VoIPProviderwelches enthält Felder wie Name, Description, URL, sowie Referenzen wie ProviderType, PhysicalAddressund Transactions.
Angenommen, ich möchte einen Webdienst erstellen, mit dem privilegierte Benutzer VoIPProviders verwalten können .
Vielleicht ist eine benutzerfreundliche ID in diesem Fall nutzlos. VoIP-Anbieter sind schließlich Unternehmen, deren Namen aus geschäftlichen Gründen in der Regel im Computersinn und sogar im menschlichen Sinn eindeutig genug sind. Es mag also genügen zu sagen, dass ein Unikat VoIPProvidervollständig von bestimmt wird (Name, URL). Angenommen, ich benötige eine Methode PUT api/providers/voip, mit der privilegierte Benutzer VoIPAnbieter aktualisieren können. Sie senden ein VoIPProviderDTO, das viele, aber nicht alle Felder enthält VoIPProvider, einschließlich einiger potenzieller Abflachungen. Ich kann ihre Gedanken jedoch nicht lesen und sie müssen mir immer noch mitteilen, über welchen Anbieter wir sprechen.
Anscheinend habe ich 2 (vielleicht 3) Optionen:
- Fügen Sie einen Primär- oder Alternativschlüssel in mein Domain-Modell ein und senden Sie ihn an das DTO und umgekehrt
- Identifizieren Sie den Anbieter, den wir interessieren, über den eindeutigen Index wie
(Name, Url) - Führen Sie eine Art Zwischenobjekt ein, das immer auf eine Weise zwischen Persistenzschicht, Domäne und DTO abgebildet werden kann, die keine Implementierungsdetails über die Persistenzschicht preisgibt - beispielsweise durch Einfügen einer speicherinternen temporären ID, wenn von Domäne zu DTO und zurück gewechselt wird.