2016-07-12 13 views
0

Ich habe versucht, über DDD und Entität und Werttypen zu lernen. Ich frage den richtigen Weg, um Werttypen innerhalb eines Entity-Typs zu setzen. In der folgenden "Leader" -Klasse habe ich eine "SetAddress" - und "SetName" -Methode, ist dies die korrekte Art, Value-Typen innerhalb eines Entity-Typs zu aktualisieren?Domain Driven Design. Entitätstyp Design

Auch ich habe eine Liste von PhoneNumbers, was ist die empfohlene Methode, damit umzugehen? Sollte ich nur hinzufügen, eine Telefonnummer in die Liste EG-

leader.PhoneNumbers.Add(new PhoneNumber("12345", Mobile); 

Danke für Ihre Hilfe:

public class Leader:Entity 
{ 
    public void SetName(string firstName, string surname) 
    { 
     Name = new Name(firstName, surname); 
    } 

    public Name Name { get; private set; } = Name.Empty; 

    public void SetAddress(string street, string city, string postode) 
    { 
     Address = new AddressDetails(street, city, postode); 
    } 

    public AddressDetails Address { get; private set; } = AddressDetails.Empty; 

    public List<Phone> PhoneNumbers { get; set; } 
} 

public class AddressDetails : ValueObject<AddressDetails> 
{ 
    public static readonly AddressDetails Empty = new AddressDetails(string.Empty, string.Empty, string.Empty); 

    public AddressDetails(string street, string city, string postode) 
    { 
     Street = street; 
     City = city; 
     Postcode = postode; 
    } 

    public string Street { get; } 
    public string City { get; } 
    public string Postcode { get; } 

    protected override bool EqualsCore(AddressDetails other) 
    { 
     return Street == other.Street && 
      City == other.City && 
      Postcode == other.Postcode; 
    } 

    protected override int GetHashCodeCore() 
    { 
     unchecked 
     { 
      int hash = 17; 
      hash = (hash * 23)^Street.GetHashCode(); 
      hash = (hash * 23)^City.GetHashCode(); 
      hash = (hash * 23)^Postcode.GetHashCode(); 
      return hash; 
     } 
    } 
} 

Antwort

1

Ich habe einen „SetAddress“ und „SetName“ -Methode, dann ist dies der richtige Weg zu Werttypen innerhalb eines Entitätstyps aktualisieren?

Es hängt davon ab, was der Geschäftsprozess modelliert wird. In DDD würden Sie normalerweise Methoden benennen, die ein Wort aus der Ubiquitären Sprache verwenden. Dieses Beispiel fühlt sich sehr CRUD-artig an. Wie nennen sie den Prozess, wenn Sie mit den Domänenexperten sprechen?

Technisch gesehen ist Ihr Beispiel ein Ansatz. Eine andere Möglichkeit wäre, die Wertobjekte direkt an die Methoden zu übergeben und somit die Konzepte den Aufrufern Ihrer API zugänglich zu machen. das heißt

public void SetAddress(AddressDetails addressDetails) 
{ 
    Address = addressDetails; 
} 

Auf diese Weise Ihre Domain nur mit Domain-Konzepte und Anrufer Ihrer API kennen zu tun hat, was die Dinge sind (das heißt ein AddressDetails Objekt, anstatt einige skalare Werte).

Auch ich habe eine Liste von PhoneNumbers, was ist die empfohlene Möglichkeit, damit umzugehen?

Es hängt davon ab, ob Sie den zugrundeliegenden Speichermechanismus, in diesem Fall eine Liste oder nicht. Alternativ könnten Sie Methoden wie AddPhoneNumber (Phone phoneNumber) verwenden, die die Tatsache verbergen, dass Sie sie in einer Liste speichern. Wenn Sie jemals den zugrunde liegenden Speicher ändern, muss die API möglicherweise nicht neu zugeordnet werden. YMMV. Wie wird der Geschäftsprozess modelliert? Ist die Liste der Telefonnummern etwas, das ein Konzept in der Domäne darstellt, die angezeigt werden sollte? Oder wird es nur von einem anderen Prozess benötigt? (d. h. etwas wie das Senden einer SMS, wenn eine Bestellung versandt wird)

+0

Vielen Dank für Ihre Hilfe. Es macht alles Sinn. Es fühlt sich fast so an, als ob ich einen "PhoneList" - oder "PhoneCollection" -Typ benötige, um mit der Liste der Telefonnummern fertig zu werden. – Andrew

Verwandte Themen