2016-09-06 5 views
5

Tworząc agregaty, czy powinniśmy tworzyć obiekty wartości wewnątrz agregatów, czy też powinniśmy przekazywać już stworzone obiekty wartości do ctor lub fabryki.DDD: Utworzenie obiektu wartości w agregacie lub przekazanie go jako parametru?

public Booking(DateTime arrivalDate, DateTime departureDate) 
{ 
     this.ArrivalAndDepartureinformation = new ArrivalAndDepartureInfo(arrivalDate, departureDate); 
} 

lub

public Booking(ArrivalAndDepartureinformation arrivalAndDepartureInfo) 
{ 
      this.ArrivalAndDepartureinformation = arrivalAndDepartureInfo; 
} 
+0

Pytanie: W jaki sposób korzystać z tych konstruktorów i gdzie te parametry konstruktora pochodzi? –

Odpowiedz

3

Utworzenie obiektów wartości wewnątrz agregatu lub przekazanie go jako parametru?

  • Jeśli mówimy o przekazywanie parametrów do konstruktora, to zależy od tego, jak jest ona wykorzystywana. Mogą istnieć pewne ograniczenia infrastruktury, które mogą wymagać użycia typów pierwotnych.

  • Jeśli mówimy o przekazywaniu parametrów do metod, to Value Objects jest w 100% moim wyborem.

Ogólnie powiedziałbym lepiej jest przekazać obiektów wartość do swoich agregatów.

Wartość Obiekty mogą:

  • make językiem modelować bardziej wyraziste
  • przynieść bezpieczeństwa typ
  • reguły walidacji hermetyzacji
  • własne zachowanie
+1

Tak więc parametry wejściowe, które są wysyłane do usługi aplikacji, są używane do konstruowania obiektów wartości, które będą wysyłane do agregującej fabryki lub konstytutorów. – Robert

+0

Tak. I możesz uzyskać mniej parametrów, bardziej specyficzne typy dla ciebie parametrów i bardziej ekspresyjny język w twoim modelu. –

3

Model domeny powinien mówić domeny, a nie prymitywów realizacji.

Twój składnik aplikacji zwykle ponosi odpowiedzialność za pobieranie nieprzetworzonych danych i wyrażanie ich w języku modelu.

2

Ogólną wytyczną polecam jest to:

  • Wewnątrz modelu domeny używaj obiektów wartości tak bardzo, jak to możliwe.
  • Konwertuj prymitywy na obiekty wartości na granicy modelu domeny (kontrolery, usługi aplikacji).

Na przykład, zamiast tego:

public void Process(string oldEmail, string newEmail) 
{ 
    Result<Email> oldEmailResult = Email.Create(oldEmail); 
    Result<Email> newEmailResult = Email.Create(newEmail); 

    if (oldEmailResult.Failure || newEmailResult.Failure) 
     return; 

    string oldEmailValue = oldEmailResult.Value; 
    Customer customer = GetCustomerByEmail(oldEmailValue); 
    customer.Email = newEmailResult.Value; 
} 

Wykonaj:

public void Process(Email oldEmail, Email newEmail) 
{ 
    Customer customer = GetCustomerByEmail(oldEmail); 
    customer.Email = newEmail; 
} 
Powiązane problemy