2009-06-04 11 views
8

Wertobjekte haben keine Identität. ORM benötigt zur Aktualisierung der Datenbank eine Identität.DDD, Wertobjekte und ORM

Wie ORM zu betrügen?

(Markierung ID für Wertobjekt als interne ORM wird nicht funktionieren, kann in verschiedenen Montage lebt und an derselben Baugruppe bewegt, ist nicht akzeptabel).

Vielen Dank im Voraus.

Antwort

4

Soweit mein Verständnis von DDD Wertobjekte sind, geht nur ein Weg, um Ihre Einheiten zu unterteilen. Wenn ein Wertobjekt mit einer ID in der Datenbank gespeichert werden soll, ist es kein Wertobjekt.

Beispiel:

Das Domain-Modell wie dieser (C#) aussieht:

public class Customer : Entity 
{ 
    public Guid CustomerID { get; } 

    public string LastName { get; set; } 

    public Address HomeAddress { get; set; } 
} 

public class Address : ValueObject 
{ 
    public string Street { get; set; } 

    public string City { get; set; } 

    public string ZipCode { get; set; } 
} 

Die entsprechende Datenbank-Tabelle so etwas wie diese (Pseudo-SQL) aussehen:

CREATE TABLE Customers 
(
    CustomerID, 

    LastName, 

    HomeAddress_Street, 

    HomeAddress_City, 

    HomeAddress_ZipCode, 
) 

Um die Adressen in einer separaten Tabelle zu speichern, würden Sie daraus eine Entität mit einer ID machen.

+5

Aber dann ist das Domain-Modell nur 1: 1 der Datenbank, die Adresse kann immer noch ein Wert-Objekt sein und immer noch eine separate Tabelle haben. – TWith2Sugars

+1

Nein, es ist kein 1: 1 der Datenbank. Sie haben eine Kundenklasse und eine Adressklasse (was das Wertobjekt ist). In NHibernate wird ein Wertobjekt als Komponente zugeordnet. Sobald Sie eine Entität haben, die eine ID benötigt, ist sie kein Wertobjekt mehr. –

+6

Aber wenn Sie die Adresse in einer Tabelle speichern müssen, wird eine ID von der Datenbank benötigt. Nur weil die Datenbank eine ID benötigt, bedeutet das nicht, dass das Objekt sofort eine Entität ist. – TWith2Sugars

3

Persönlich habe ich das Id-Feld in dem Wertobjekt - ich habe es als ein weiteres Attribut des Wertobjekts zu behandeln (wie Namen, Standort usw.).

Es kann nicht wahr DDD sein, aber es funktioniert für mich.

+2

Ich glaube nicht, dass es ein Problem damit überhaupt gibt. Eric Evans Kopf dreht sich, weil es einfach ist, über Konzepte zu reden, ohne ein Beispiel zu nennen. –

35

Wenn Eric Evans über "Entitäten haben Identität, Wertobjekte nicht" spricht, spricht er nicht über eine ID-Spalte in der Datenbank - er spricht über Identität als Konzept.

VOs haben keine konzeptionelle Identität. Das bedeutet nicht, dass sie nicht Persistenz Identität haben sollten. Lassen Sie sich durch die Persistenz-Implementierung nicht Ihr Verständnis von Entitäten und VOs erklären.

Siehe meinen Beitrag here.

+0

Aber ich möchte diesen Mangel an konzeptioneller Identität im Code zeigen. Übrigens, ich habe diesen Beitrag schon mal gesehen. –

+1

Um Ihre Anforderung zu verdeutlichen: Sie möchten die ID-Eigenschaft auf Ihrem VO-Objekt verbergen, aber Sie benötigen das ORM, um die ID-Eigenschaft zu sehen? Zwei Fragen: 1) Kann Ihr ORM auf private/interne Felder zugreifen? (Wie NHibernate) 2) Wie viel Nutzen erhalten Sie, indem Sie die VO-ID-Eigenschaft "verstecken"? –

+0

Vergessen zu erwähnen - ich benutze NHibernate ... Also - wie geht das mit NHibernate? –