3 Gründe, Identität als ValueObjekt zu modellieren

3 Gründe, Identität als ValueObjekt zu modellieren

20. März 2024 | Gregor Koletzki | 1 Min. Lesezeit

Eine der prägenden Eigenschaften einer Entität ist ihre Identität. Es gibt verschiedene Möglichkeiten, Identität darzustellen. Wir beispielsweise eine GUID oder ein Int verwenden, die als Primärschlüssel in einer SQL-Tabelle gespeichert ist. In DDD-Implementierungen könnte man ein anderes Muster benutzen - die Verwendung von Value Objekten als Identifikatoren für Entitäten. Was ist der Sinn davon?

Es ist keine Voraussetzung, aber es gibt ein paar Gründe, warum die Verwendung von Value Objekten für die Identität langfristig Ihrem Modell zugutekommen könnte.

Vereinfachen zukünftiger Änderungen an den zugrunde liegenden Identitätswerten

Möchte man in der Zukunft Änderungen an den Identitätswerten vollziehen, wie z.B. den int in eine Guid umwandeln, muss man nicht alle stellen ändern die den Identitätswert beinhalten. Wenn wir unsere Entität so modellieren:

public record CustomerId(Guid Value);

public class Customer
{
    public Customer(CustomerId id)
    {
        Id = id;
    }

    public CustomerId Id { get; }
}
public class CustomerService 
{
    public Customer GetCustomer(CustomerId id)
    {
        // Retrieve Customer
    }
}

Möchten wir den Identitätswert jetzt von einem Guid in einen anderen Typen ändern müssen wir das nur an dem Value Objekt tun und nicht noch an dem CustomerService

Schützen vor ungültigen Identitätswerten.

Wir können mit einem Value Objekt sicherstellen das der Identitätswert auch ein gültigen Wert beinhaltet. Als Beispiel:

public record CustomerId
{
    public Guid Value { get; }

    private CustomerId(Guid value)
    {
        Value = value;
    }

    public static CustomerId Create(Guid value)
    {
        if (value == Guid.Empty) throw new ArgumentException($"{nameof(CustomerId)} is {Guid.Empty}");
        return new CustomerId(value);
    }
}

Der Compiler kann helfen, Fehler zu erkennen

Wenn man Value Objekte als Identitätswerte benutzt so hilft der Compiler wenn man z.B. eine falschen Identitätswert benutzt. Man arbeitet in dem Moment Typisiert.

public class Product 
{
    public Guid ProductId { get; }
    public Guid CustomerId { get; }

    public Product(Guid productId, Guid customerId)
    {
        ProductId = productId;
        CustomerId = customerId;
    }
}

public class ProductService 
{
    public void AddProduct(Guid customerId, Guid productId)
    {
        var product = new Product(customerId, productId);
    }
}

Dieser Code würde Kompilieren aber zur Laufzeit Fehler verursachen.

Fazit

Es ist nicht notwendig das man Value Objekte als Identitätswerte benutzt, diese können aber Fehler verhindern und der Code ist leserlicher.

Weiterführende Artikel

Kategorien

Kontaktieren Sie uns:

Harksheider Weg 60H,
25451 Quickborn
+49 1520 40 73 253
info@gk-itsolutions.de

Schnellzugriff:

Folgt uns auf: