5 Stimmen

Wie man mit einem Wertobjekt umgeht, das Daten in der Datenbank nachschlagen muss

Ich fange gerade erst mit dem Studium des Domain Driven Design an und es ist gut möglich, dass mein Verständnis der Entities/Values-Trennung fehlerhaft ist, wenn das so ist, lassen Sie es mich bitte wissen.

Nach meinem Verständnis ist eine Adresse der Inbegriff eines Wertobjekts, da ihre Identität vollständig durch ihre Eigenschaften definiert wird. Nach meinem Verständnis bedeutet dies unter anderem, dass es kein separates Repository oder Datenzugriffsobjekt für Adressen geben sollte.

Dies stellt mich vor ein Dilemma, da in meinem Fall eine Adresse ein Land enthält, wobei ein Land einen Namen und einen Ländercode hat und die Liste der Ländercodes aus der Datenbank geladen werden soll.

Meine Frage ist, wie kann ich das gestalten? Ich möchte, dass die Benutzer eine Adresse mit dem neuen Operator erstellen können, aber ich möchte kein Datenzugriffsobjekt für das Land erstellen, und wenn ich das tue, möchte ich sicherlich keinen Verweis darauf in das Adressobjekt aufnehmen.

Ich habe ein paar Ideen, aber ich würde gerne alle Vorschläge hören, die jemand hat.

3voto

Simon Laroche Punkte 542

DDD schließt nicht aus, dass Wertobjekte Referenzen auf Entitäten enthalten. Daher würde Ihre Adresse einen Verweis auf eine Länderentität enthalten.

1voto

e.James Punkte 112528

Zunächst möchte ich sagen, dass meine einzige Erfahrung mit domänenorientiertem Design die Lektüre des Wikipedia-Artikels vor ein paar Minuten war. Davon abgesehen, sind hier meine Gedanken zu Ihrer Frage:

Ich stimme zu, dass das Adressobjekt keine Datenzugriffsobjekte benötigen sollte. Wie wäre es also mit einer Adressfabrik, die die Ländercodes verarbeitet und Adressobjekte auf der Grundlage der Eingaben des Benutzers erstellt? Auf diese Weise würde die Fabrik die Datenzugriffsobjekte enthalten, und Ihr Adressobjekt könnte rein wertorientiert bleiben.

Wenn dies laut DDD nicht koscher ist, dann lassen Sie es mich bitte wissen. Ich bin neugierig, was der Rest der Gemeinschaft kommt mit zu sehen.

1voto

Alexander Abramov Punkte 1370

Wenn Sie nach DDD vorgehen, sollten Sie zuerst über die Bedürfnisse Ihrer Anwendung nachdenken und das Modell von dort aus aufbauen.

Sie sollten sich keine Sorgen machen, dass Country nur in Address verwendet wird. Es ist nicht falsch, es zu einer Entität per se zu machen. Die Hauptfrage ist: Denken Sie bei einem Land an etwas, das eine Identität hat, oder ist es nur durch Attribute definiert? Wenn Sie zwei Länder mit demselben Namen (und demselben Ländercode) haben, sehen Sie da einen Unterschied?

Vielleicht sollten Sie erwägen, Country zu einem Wertobjekt zu machen. Es hindert Sie nicht daran, ein Repository zu haben, das eine Liste von Ländern aus der DB lädt, oder Country basierend auf seinem Code zu laden. Auf der Implementierungsseite kann Ihr Repository die Liste der Länder immer noch einmal aus der Datenbank laden und sie im Speicher zwischenspeichern. Oder es könnte sie hart kodiert haben oder aus XML lesen. Ihr Domänenmodell würde sich nicht darum kümmern.

Sie werden wahrscheinlich eine Factory-Methode für Address erstellen, die neben anderen Parametern auch den Ländercode akzeptiert. Dann würde das Repository verwendet, um eine Country-Instanz zu erstellen und ein korrektes Address-Objekt zurückzugeben.

Wenn man über Aggregate nachdenkt, kann man auch einige Ideen zum Repository-Layout entwickeln.

Ich hoffe, das hilft

0voto

HardCode Punkte 6311

Dies stellt für mich ein Dilemma dar, da in meinem Fall eine Adresse ein Land enthält enthält, wobei ein Land einen Namen und einen Länderkürzel hat und die Liste der Ländercodes aus der Datenbank geladen werden aus der Datenbank geladen werden soll.

Das Objekt "Adresse" würde keine Liste von Ländern als Eigenschaft haben. Vielmehr würde es eine einzige Instanz des Länderobjekts enthalten. Die Präsentationsschicht würde eine Liste von Länderobjekten bereitstellen, die wahrscheinlich in einer Dropdown-Liste enthalten wäre. Beim Laden einer bestimmten Adresse würden Sie den Wert der Auswahlliste gleich der Länder-ID des Länderobjekts setzen, das eine Eigenschaft des Adressobjekts ist. Mit anderen Worten:

Wert des ausgewählten Objekts von myDropDown (das eine Liste von Länderobjekten enthält) = address.Country oder myDropDown's Schlüsselwert = Adresse.Land.ID

Um die Präsentationsschicht aufzufüllen, sollte Ihre Datenzugriffsschicht eine Funktion bereitstellen, die eine Rohliste von Länderobjekten zurückgibt. In einer .NET-Umgebung würde das etwa so aussehen:

Namespace Dal

    Public NotInheritable Class Countries
    ...
    Public Shared Function Read(ByVal countryId as Integer) As BusinessObjects.Country
    ...
    Public Shared Function ReadList() As List(Of BusinessObjects.Country)
    ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X