2016-11-03 3 views
0

Ich brauche Hilfe mit einem Wertobjekt. Betrachten Sie das folgende Beispiel.DDD Umgang mit Wertobjekten ohne Repository

Ich habe Entität Karte, die pan Währung (USD, EUR, GBP) hat und Kartentyp (Visa, Visa Electron, Mastercard). Ich denke Währungen und Kartentypen sind Wertobjekte und sie werden im Quellcode gespeichert. Laut DDD haben Wertobjekte keine Repositories.

  1. Die Frage ist, wie die Dropdown-Listen von Währungen und eine Karte Typen in der Schnittstelle zu füllen, wenn neue Karten-Einheit zu schaffen.
  2. Wo setzen, dass Klassen in der Anwendung, Domain oder Infrastrukturschicht und wie Daten von ihnen abzurufen.

Ein einfaches Beispiel wäre von unschätzbarem Wert“

UPDATE1

, dass mein erster Ansatz war aber .. ich Währungen in anderen Unternehmen wie Moneytransfer dort i EUR USD GBP nutzen und ein paar mehr so ​​muss ich eine mehr enum erstellen

Auf diese Weise verdoppeln ich einige Währungen und wenn wir aufhören zu verarbeiten Payme In USD muss ich alle Enums finden und die USD-Währung löschen.

+0

http://stackoverflow.com/questions/679005/how-are-value-objects-stored-in-the-database – QuietNaN

+0

Was bedeutet "Verarbeitung von Zahlungen in USD zu stoppen"? Dies bedeutet, dass für Ihre Anwendung USD nicht mehr für neue Transaktionen verwendet wird oder dass alles, was USD hat, gelöscht werden sollte? Was passiert mit Ihren gespeicherten Daten, wenn Sie aufhören, USD zu verwenden? Es scheint mir mehr ein Validierungsproblem als Domänenmodellierung. Denken Sie aus Ihrer Domänenperspektive nach. – rascio

+0

Bedeutet, dass Sie keine Karte in USD bestellen können oder Sie können keine Überweisung in USD senden. Nichts sollte gelöscht werden. – Stasa

Antwort

1

Versuchen Sie nicht, einfache Dinge kompliziert zu machen.

Wenn Sie a-priori alle möglichen Werte dieser VO kennen, können Sie sie als enum haben.

public enum Currency{ 
    USD, EUR, GBP 
} 

Und dann aus dem Code:

Currency.values() 

Fragen Sie sich, wie oft diese Werte ändert? (Wie oft wird eine neue Art von Währung vom System verwendet?)
Sind die Kosten für die Entwicklung und Wartung eines Systems (wie db-Tabellen) zu entfernen, entfernen Sie diese Werte dynamisch, ohne die Anwendung neu zu starten, als ein Enum zu verwenden und das Projekt neu zu kompilieren wenn es eine Veränderung gibt?

Oft wurde ich für diese Lösung mit Argumenten wie "Ich brauche eine Beschreibung des Wertes", wie in einer Ansicht schreiben "Euro", wenn Sie den EUR-Wert haben, wenn Sie eine Tabelle haben können, wurde kritisiert eine Beschreibungsspalte
Diese leicht gelöst werden kann eine Eigenschaft mit Hilfe Datei wie:

labels.currency.EUR=Euro 
labels.currency.USD=Dollars 

prüft auch dies:
- Loading a Value object in List or DropdownList, DDD
- Simple aggregate root and repository question

+0

Vielen Dank für Ihren Kommentar. Bitte überprüfe update1. – Stasa

1

Sie VOs falsch verstanden, ein paar mehr Infos über sie lesen, ich glaube, einfache Möglichkeit, sie zu verstehen ist Person/Addres Beispiel nachzuschlagen.

Was ist mit Ihrem Fall, erstellen Sie einfach 3 Tabellen, versuchen Sie nicht, einfache Dinge kompliziert zu machen:

Card (CardID, CurrencyID, CardTypeID) 
Currency (CurrencyID, CurrencyName) 
CardType (CardTypeID, CardTypeName) 

Für Dropdowns werden Sie nur Währung & Cardtype Tabellen abfragen. Und in Zukunft, wenn Sie neue Währung oder CardType hinzufügen, wird es einfach zu tun sein.

0

Currency und CardType sind nicht unbedingt sinnvoll, Wertobjekte. Value-Objekte modellieren ein konzeptionelles Ganzes, das verwandte Attribute enthält. Wertobjekte können verglichen werden, indem alle ihre Attribute verglichen werden.

Denken Sie zum Beispiel eines MonetaryValue Wertobjekt, das mit einer Währung zusammen aus einem numerischen Wert besteht:

public class MonetaryValue { 

    private BigDecimal value; 
    private Currency currency; 

    public Amount(BigDecimal value, Currency currency) { 
     // validations: 
     assertNotNull(value); 
     assertNotNull(currency); 

     this.value = value; 
     this.currency = currency; 
    } 
    [...] 
} 

Wert (zum Beispiel 100) und Währung (z eur) beschreiben zusammen den Wert einer Sache. Das Ding ist nicht nur "100" wert und nicht nur "eur", sondern "100 eur".

Der Vergleich von Wertobjekten ist ebenfalls wichtig. Wenn über monetäre Werte gesprochen wird, müssen beide Attribute, Wert und Währung, verglichen werden. Den Wert ohne die Währung zu vergleichen würde nicht viel helfen, da 100 usd nicht dasselbe ist wie 100 eur. Dies ist ein weiterer Hinweis, dass MonetaryValue ein sinnvolles Wertobjekt sein könnte.