2015-07-10 5 views
17

Zacząłem od czytania o CQRS i jestem trochę zdezorientowany.CQRS - czy dozwolone jest wywoływanie strony czytającej po stronie zapisu?

Czy można wywołać stronę odczytu po stronie zapisu w celu uzyskania dodatkowych informacji?

http://cqrs.nu/Faq/command-handlers tutaj mówią, że jest to niedozwolone, ale w kodzie podróżnym cqrs znalazłem, że nazywają usługę "IPricingService", która wewnętrznie używa klasy usługi DAO.

Co muszę zrobić, aby uzyskać dodatkowe informacje w katalogu głównym agregacji?

Odpowiedz

19

CQRS Journey nie powinien być traktowany jako podręcznik. To tylko historia jakiegoś zespołu walczącego o drogę do CQRS i mającego wszystkie ograniczenia użycia tylko stosu Microsoftu. Per se nie powinieneś używać swojego modelu odczytu w modułach obsługi komend lub w logice domeny. Możesz jednak wysłać zapytanie do modelu odczytu od klienta, aby pobrać potrzebne dane do komendy i zatwierdzić komendę.

Od czasu, gdy dostałem kilka słów na temat tej odpowiedzi, muszę wskazać, że to, co napisałem, jest ustaloną praktyką we wzorcu. Żadna strona odczytu nie uzyskuje dostępu do strony zapisu, a strona zapisu nie otrzymuje danych od strony odczytu.

Jednak definicja "klienta" może być przedmiotem dyskusji. Na przykład nie ufałbym, że publiczna aplikacja przeglądarki JS jest odpowiednim "klientem". Zamiast tego użyłbym mojej warstwy interfejsu REST API jako "klienta" w CQRS, a aplikacja internetowa byłaby po prostu warstwą interfejsu użytkownika dla tego klienta. W takim przypadku przetwarzanie wywołania usługi REST API API będzie prawidłowym czytnikiem strony, ponieważ musi zweryfikować całą wysyłaną warstwę interfejsu, aby zapobiec fałszerstwu i zweryfikować niektóre reguły biznesowe. Po wykonaniu tej pracy polecenie zostanie utworzone i przesłane do strony zapisu. Walidacje i wszystko inne jest synchroniczne, a obsługa poleceń jest asynchroniczna.

UPDATE: W świetle niektórych poniżej nieporozumień, chciałbym wskazać na Udi's article from 2009 mówisz CQRS w ogóle, poleceń i walidacji w szczególności.

+2

Nie zgadzam się. Jeśli potrzebujesz, aby twoje komendy zawierały dane potrzebne do sprawdzenia poprawności twojego polecenia, to nigdy nie możesz zmienić logiki walidacji w obrębie twojego handlera/domeny bez wpływu na * klienta *. To wyraźnie ujawnia klientowi zbyt dużą część wiedzy o sprawdzaniu poleceń/wiedzy o danej dziedzinie i jest sprzeczne z tym, że klient chce jedynie wyrazić zamiar. IMHO lepszym rozwiązaniem jest zapewnienie interfejsu "PricingService" (który jest częścią wszechobecnego języka) do twoich zagregowanych korzeni, a następnie implementacja interfejsu w razie potrzeby - co może obejmować zapytanie o stronę do odczytu. –

+0

Będę musiał ten drugi. – JoG

+2

@AlexanderLanger To nie jest coś, co wymyśliłem, tak zaprojektowano wzór. Może się okazać, że możliwe jest wysłanie zapytania do strony odczytu z programu obsługi komend, ale będzie to coś innego niż ten wzorzec. Jeśli spojrzysz na dowolny diagram na CQRS, nigdy nie zobaczysz, że model odczytu jest sprawdzany przez tryb zapisu. Jest czytany tylko przez klienta. –

2

CQRS FAQ (http://cqrs.nu/Faq) sugeruje:

„Jak mogę komunikować się między kontekstach ograniczonych

wyłącznie w kategoriach ich publicznych API Może to dotyczyć subskrypcji zdarzeń pochodzących z innego ograniczonego kontekstu lub?.. jeden ograniczony kontekst może działać jak zwykły klient innego, wysyłając polecenia i zapytania ".

Tak więc chociaż w ciągu jednego BC nie można używać strony do odczytu po stronie zapisanej i na odwrót, inny ograniczony kontekst lub usługa mogłaby. W gruncie rzeczy będzie to działać jak człowiek wykorzystujący interfejs użytkownika.

Powiązane problemy