Próbowałem wzorca CQRS za pomocą Mediaata i kocham Clean State, w którym transformują się aplikacje. We wszystkich przykładach widziałem i używałem, zawsze robię

await Mediator.Send(command);

Jest to samo dla pytań

var data = await Mediator.Send(queryObject);

Właśnie zdałem sobie sprawę, że jest też mediator.Publish, który po wyszukaniu wydaje mi się robić to samo. Próbuję zrozumieć, jaka jest różnica między mediatorem.Send i mediatorem. Przeczytałem Dokumenty Biblioteki Mediaatrów i nadal nie rozumiem, czym jest różnica między nimi. Uprzejmie pomóż mi zrozumieć różnicę.

Dzięki za pomoc

7
Tonto 31 lipiec 2020, 09:12

1 odpowiedź

Najlepsza odpowiedź

MediaTr ma dwa rodzaje wiadomości wysyłanych:

  • Wiadomości o żądanie / odpowiedź, wysyłane do pojedynczego przewodnika
  • Wiadomości powiadomień, wysyłane do wielu obsługi
  • Send może zwrócić odpowiedź, ale nie musisz tego robić.
  • Publish nigdy nie zwróć wyniku.

Wysyłasz prośby (czasami nazywane polecenia ) przez _mediator.Send({command}) do dokładnie jednej betonu. Może to być np. polecenie, które zapisuje nowy produkt do bazy danych. Często jest to żądanie od użytkownika (Frontend / API) lub czasami może być wewnętrzne polecenie w systemie podawanym przez inne usługi w sposób synchroniczny. Zawsze oczekuje się, że polecenie zostanie wykonane natychmiast, a otrzymasz właściwy wynik lub błąd, aby natychmiast poinformować klienta o pewnych awariach.

Publikujesz powiadomienia (często nazywane zdarzenia) przez _mediator.Publish({event}) do zera, jednego lub wielu ładowarek. Użyłeś powiadomień, gdy chcesz opublikować pewne informacje i nie wiesz, kto tego potrzebuje. Na przykład. NewProductEvent, który jest publikowany po pomyślnym dodaniu produktu do modułu magazynowego . Niewiele innych kontekstów chce subskrybować informacje i np. Wyślij e-mail do klienta, który jest dostępny nowy produkt lub utwórz pewną domyślną konfigurację produktu w module (która płatność i dostawa są dostępne dla produktu). Możesz używać powiadomień w sposób synchroniczny. Wszystkie dane zostaną zapisane w jednej transakcji (konfiguracja produktu i przechowywania) lub możesz użyć niektórych wzorów asynchronicznych z magistrali usług lub / i Sagas . W drugim przypadku (asynchroniczne) należy ręcznie obsługiwać przypadki, gdy coś się nie wystąpi w innych usługach lub kontekstach, które subskrybują powiadomienie.

Przykładowy scenariusz: Domyślna konfiguracja nie została utworzona.

  • Jeśli masz jedną transakcję (synchroniczny sposób) przez kilka kontekstów, pojawi się błąd, zaloguj błąd i zwróć go do użytkownika / klienta.
  • W sposób asynchroniczny wysyłasz zdarzenia po zapisaniu nowego produktu do bazy danych. Nie chcesz mieć produktu w stanie błędu w swoim systemie. Po raz pierwszy polecam tworzenie go w stanie projektu i czekać na wydarzenie, które informuje Cię o pomyślnie utworzonej konfiguracji, a następnie zmienia stan na nową / nową / poprawną itp.

Dobrym przykładem korzystania z mediata znajdziesz w e.g. Zamawianie Microvice w Eshoponconalners przez Microsoft : Github. Zobaczysz przykład użycie CQRS i DDD z rdzeń EF i sieci ASP.

14
sajadre 30 grudzień 2020, 13:17