DDD - izolacja elementów agregatu

DDD - izolacja elementów agregatu
HI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1862
0

Hej.

Próbuje zrozumieć jak powinny być zaprojektowane modele DDD.

Zakłądając, że robimy obsługę zamówień.

Mamy klasę Order z właściwościami

Kopiuj
GUID id
string number
IList<OrderPosition> positions

oraz OrderPosition

Kopiuj
GUID id
Product Product 
int count

Jeżeli dobrze rozumiem agregatem będzie Order.
Stworzenie obiektu OrderPosition powinno być dostępne tylko z poziomu obiektu Order.

Dobrze myślę?
W jaki sposób to zrealizować?

Pozdrawiam

RJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 480
0

Fabryka po stronie agregatu InsertOrderPosition i ta klasa OrderPosition siedzi na domenie, ale nikt inny jej nie rusza, tylko agregat wystawia kontrakt?

HI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1862
0

W jakim sensie "klasa OrderPosition siedzi na domenie"?

markone_dev
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 833
2
hipekk napisał(a):

Próbuje zrozumieć jak powinny być zaprojektowane modele DDD.

Tak jak to wynika z logiki biznesowej, nie ma uniwersalnego sposobu. To co w jednym kontekście będzie agregatem w innym będzie encją albo value objectem.

Co do twojego przykładu, za co odpowiada klasa OrderPosition? Widzę tylko jakieś id i count. To jest jakaś uproszczona wersja czegoś na wzór:

Kopiuj
public class OrderItem
{
  public Product Product { get; }
  public int Amount { get; }
}
hipekk napisał(a):

Stworzenie obiektu OrderPosition powinno być dostępne tylko z poziomu obiektu Order.

Może być a nie musi, zależy od wymagań, w jaki sposób pozycje są tworzone i dodawane do zamówienia. Nie znając dokładnych wymagań ja bym pewnie zrobił coś w tym stylu

Kopiuj
public class Order
{
  public void AddProduct(Product product, int amount)
  {
    // jakaś walidacja, np. żeby ten sam produkt nie występował na osobnych pozycjach
    // może wyliczenie rabatu dla konkretnego produktu na podstawie jakichś reguł, pobranych wcześniej

    var item = OrderItem.Create(product, amount);

    items.Add(item);

    // może być tu a może być gdzieś indziej, np. wyliczanie może nastąpić po zmianie statusu na 'zamówienie
    //zatwierdzone'... znowu zależy
    RecalculateTotalValue(); 
  }
}

Także nie ma tu jednego prawidłowego sposobu.

RJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 480
0

@hipekk: nic spoza projektu domeny nie może utworzyć jej instancji. Agregat powinien sie tym zajmować przy pomocy factory method. Ewentualnie wystawiasz fabrykę OrderPosition i po stworzeniu agregat ją dodaje do kolekcji.

Nic nie moze operować na wewnętrznej kolekcji, prócz agregatu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.