Jest jedna rzecz o CQRS, której nie otrzymuję: Jak zaktualizować odczytany model, gdy podniesione zdarzenie nie zawiera szczegółów potrzebnych do zaktualizowania odczytanego modelu.Zdarzenia CQRS nie zawierają szczegółów potrzebnych do aktualizacji modelu odczytu
Niestety, jest to dość powszechny scenariusz.
Przykład: dodaję użytkownika do grupy, więc wysyłam polecenie addUserToGroup (id_użytkownika, groupId). To jest odbierane, obsługiwane przez program obsługi komend, zdarzenie userAddedToGroup jest tworzone, przechowywane i publikowane.
Teraz obsługa zdarzeń otrzymuje to zdarzenie i oba identyfikatory. Teraz pojawi się widok, który wyświetli listę wszystkich użytkowników z nazwami grup, w których się znajdują. Aby zaktualizować model odczytu dla tego widoku, potrzebujemy identyfikatora użytkownika (który mamy) i nazwy grupy (której nie robimy). t mamy, mamy tylko jego identyfikator).
Pytanie brzmi: jak obsłużyć ten scenariusz?
Obecnie cztery opcje przychodzą mi do głowy, wszystkie z ich specyficznych wad:
Model odczytu zwraca się do domeny. => Zabronione, a nawet niemożliwe, ponieważ domena ma tylko zachowanie, nie ma (publicznego) stanu.
Odczytany model odczytuje nazwę grupy z innej tabeli w przeczytanym modelu. => Działa, ale co, jeśli nie ma zgodnej tabeli?
Dodaj potrzebne dane do wydarzenia. => Nie działa, ponieważ oznacza to, że musiałem aktualizować wszystkie poprzednie wydarzenia, i nie mogę przewidzieć, które dane będę potrzebował jednego dnia.
Nie obsługuj zdarzenia za pomocą "zwykłej" obsługi zdarzeń, ale rozpocznij proces ETL w tle, który zajmuje się składnicą zdarzeń, tworzy potrzebne dane i zapisuje odczytany model. => Działa, ale wydaje mi się, że to trochę za dużo dla takiego prostego scenariusza.
Pytanie brzmi: Jak poprawnie poradzić sobie z tym scenariuszem?
Okay, do tej pory, dostałem to ;-) To, czego jeszcze nie dostałem, to: Zakładam, że moje wydarzenie PurchaseOrderSubmitted _today_ nie zawiera podatku VAT. Teraz, szybko, do pewnego momentu w przyszłości, gdzie ja to robię. Oczywiście mogę stworzyć nowe wydarzenie, zasadniczo V2.0, które zawiera podatek VAT - ale to nie pomaga we wszystkich zamówieniach z przeszłości, prawda? Jak sobie z tym poradzić? –
Możesz zmienić strukturę modelu i strukturę wydarzeń niezależnie od siebie. Gdy model zostanie rozszerzony o nową informację (np. VAT), obsługa starego zdarzenia pozostanie niezmieniona lub ustawi nową właściwość na wartość domyślną. Podobnie jak w przypadku dodawania nowej kolumny do tabeli bazy danych: Nowa kolumna musi mieć wartość zerową lub inną wartość domyślną dla wszystkich wpisów z odwołaniami. Za każdym razem, gdy zdarzenie zostanie odtworzone lub użyte do uwodnienia odczytanego modelu, nowe pole zostanie ustawione na dowolną wartość domyślną, jakiej potrzebujesz. –
OK, dzięki, to ma sens :-)! –