Chcę wdrożyć moją pierwszą aplikację przy użyciu wzorca CQRS wraz z Event Sourcing. Zastanawiam się, jak prawidłowo obsługiwać tworzenie zagregowanych korzeni. Powiedzmy, że ktoś wysyła polecenie CreateItem. Jak sobie z tym poradzić? Gdzie należy przechowywać zdarzenie ItemCreated? Jako pierwsze wydarzenie nowego przedmiotu? Czy powinienem mieć jakiś element ItemList, który agreguje wszystkie elementy, a lista zdarzeń zawiera tylko zdarzenia ItemCreated?
Udi Dahan sugeruje, aby nie tworzyć zagregowanych korzeni i zawsze używać zamiast tego jakiejś metody pobierania. Ale jak mogę pobrać coś nowego i na pewno nie ma przypisanego żadnego identyfikatora. Rozumiem tę ideę i rozsądnie jest myśleć, że nowy obiekt to obiekt, którego stan składa się z odpowiedzi na zero zdarzeń. Ale jak mam go używać? Czy powinienem mieć w moim repozytorium odrębną metodę, taką jak getNewItem()
lub uczynić moją get(id)
metodę akceptującą Optional<ItemId>
?
Edycja: Po pewnym czasie kopania znalazłem naprawdę ciekawą implementację wyżej wymienionych wzorców za pomocą aktorów. Autor zamiast tworzyć agregat pobiera go z pewnego rodzaju repozytorium z nowo utworzonym UUID. Wadą tego podejścia jest to, że pozwala on na przejściowy stan niespójności. Zastanawiam się także, jak mogę wdrożyć delete
metodę z takim podejściem. Po prostu dodać usunięte wydarzenie do listy zdarzeń agregatu?