Próbuję nauczyć się DDD i powiązanych tematów. Wpadłem na pomysł prostego, ograniczonego kontekstu, aby zaimplementować „bank”: istnieją konta, pieniądze można wpłacać, wypłacać i przenosić między nimi. Ważne jest również, aby zachować historię zmian.
Zidentyfikowałem podmiot konta i pozyskanie tego zdarzenia byłoby dobrze śledzić zmiany w nim. Inne byty lub obiekty wartości nie mają znaczenia dla problemu, więc nie wspomnę o nich.
W przypadku wpłat i wypłat - jest to stosunkowo proste, ponieważ zmodyfikowano tylko jeden agregat.
Podczas transferu jest inaczej - dwa agregaty muszą zostać zmodyfikowane przez jedno zdarzenie MoneyTransfers . DDD przestaje modyfikować modyfikowanie wielu agregatów w jednej transakcji. Z drugiej strony zasada pozyskiwania zdarzeń polega na stosowaniu zdarzeń do podmiotów i modyfikowaniu stanu na ich podstawie. Gdyby zdarzenie mogło być przechowywane po prostu w bazie danych, nie byłoby problemu. Aby jednak nie dopuścić do jednoczesnej modyfikacji jednostek pochodzących ze zdarzeń, musimy zaimplementować coś zmieniającego strumień zdarzeń każdego agregatu (aby zachować granice transakcji). Z wersjonowaniem wiąże się kolejny problem - nie mogę używać prostych struktur do przechowywania zdarzeń i odczytywania ich z powrotem w celu zastosowania ich do agregacji.
Moje pytanie brzmi - jak mogę połączyć te trzy zasady: „jedna agregacja jedna transakcja”, „zdarzenie-> zmiana agregacji” i „jednoczesne zapobieganie modyfikacjom”?