Czy podczas korzystania z DDD i CRQS powinno być dokładnie jedno zdarzenie na polecenie?

17

Szukam sposobu zaprojektowania aplikacji ddd z konwencją nad konfiguracją.

Powiedz, że zagregowany „Klient” ma zdefiniowaną komendę „FillProfile”. Logicznie wywoła zdarzenie „ProfileFilled”.

Czy zdarzają się przypadki, gdy polecenie wywoła więcej niż zdarzenie lub gdy polecenie wywoła inne zdarzenia w oparciu o jakąś logikę? Czy jest to zawsze relacja 1 - 1 (1 komenda zawsze nie zgłosi żadnego lub pojedynczego zdarzenia danego typu).

Proszę o to, ponieważ jeśli jest to fakt, że polecenie zawsze wywoła to samo zdarzenie, mogę na tym fakcie zbudować system konwencji. Wiem, że „RaiseEvent” spowoduje „EventRaised” ...

Ludovic C.
źródło
1
jeśli polecenie powoduje 2 rzeczy, możesz spodziewać się, że każda rzecz wywoła zdarzenie. ProfileGenerated, ProfileSaved, również każde zdarzenie może spowodować błąd, który ponownie może wywołać zdarzenie
Ewan
Również trywialnie systemy mogą implementować zdarzenia BeforeCommand, AfterCommand itp.
Ewan,
Lub polecenie może zapętlić się, np. FillProfiles () profileFilled, profileFilled ....
Ewan
@Ewan, chcę cię tylko poprawić. Zdarzenie w domenie nie może wygenerować błędu. Tylko polecenia mogą. Zdarzenia domenowe oznaczają, że coś się wydarzyło , ponieważ polecenia oznaczają, że istnieje intencja, aby coś się wydarzyło, co można odrzucić lub zaakceptować. Innymi słowy, błąd musi zostać zgłoszony przed wywołaniem zdarzenia domeny (chyba że to zdarzenie domeny jest oczywiście związane z rejestrowaniem błędów).
Ludovic C,

Odpowiedzi:

18

Ponieważ otagowałeś swoje pytanie słowem „CQRS”, myślę, że masz na myśli zdarzenia w kontekście „CQRS i pozyskiwania zdarzeń”, tak jak to opisano tutaj . W tym samouczku dobrze wyjaśniono różnicę między zdarzeniami a poleceniami:

  • zdarzenia wychwytują elementarne „rzeczy, które mogą się zdarzyć” w twoim systemie, z punktu widzenia systemu.

  • polecenia są definiowane przez to, co użytkownik uważa za operację, z jego punktu widzenia

I chociaż często prowadzi to do kilku poleceń i zdarzeń w korespondencji 1: 1, te różne punkty widzenia mogą prowadzić do poleceń, które uruchamiają więcej niż jedno zdarzenie, lub różnych zdarzeń w zależności od parametrów polecenia. Mogę sobie nawet wyobrazić przypadki, w których polecenie w ogóle nie wywołuje zdarzenia, ale byłby to bardzo wyjątkowy przypadek, niezbyt typowy.

Na przykład samouczek wspomina o zdarzeniach

  • TabOpened
  • Napoje Zamówione
  • FoodOrders

i polecenia

  • OpenTab
  • Złożyć zamówienie

Tutaj polecenie „OpenTab” doprowadzi do zdarzenia „TabOpened”, ale polecenie PlaceOrder doprowadzi do zdarzeń „DrinksOrders”, „FoodOrders” lub obu.

W rzeczywistości, jeśli projektujesz nowy system „od zera”, możesz spróbować zaprojektować go za pomocą korespondencji 1: 1 między poleceniami i zdarzeniami i sprawdzić, jak dobrze to się skaluje, gdy system staje się większy. Możesz nawet wypróbować podejście hybrydowe: listę zdarzeń i poleceń z korespondencją 1: 1 wraz z kilkoma dodatkowymi połączonymi poleceniami. Po prostu spróbuj, jak daleko cię to zaprowadzi w konkretnym projektowanym systemie.

Doktor Brown
źródło
10

Zwykle jedno polecenie prowadzi do jednego zdarzenia. Ale w niektórych przypadkach może to być więcej niż jeden, zależy to od implementacji.

Albo twoje polecenie wywołuje inne polecenia i każde z nich uruchamia własne zdarzenia. Albo twoje polecenie samodzielnie wykonuje różne zadania i wydaje wiele zdarzeń. Na przykład:

RegisterUserCommand

  • User.create (adres e-mail, hasło) → UserCreatedEvent
  • User.updateProfile (firstName, lastName, location) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent
synthomat
źródło
Co się stanie, jeśli później zdecydujesz się na to UserWasAddedToCrm? Przepisz cały swój strumień?
mcintyre321
@ mcintyre321 szukaj choreografował vs wydarzenia zorganizowane
Benten
10

Jedno polecenie może wywołać wiele zdarzeń. Jest to po prostu logiczne zakończenie jednego faktu: Composite commandistnieje.

Powiedzmy, że masz dwie komendy, z których każda wywołuje zdarzenie. Następnie utwórz złożone polecenie tych dwóch. Z punktu widzenia jednego używającego polecenia złożonego wydaje się, że polecenie wywołało dwa zdarzenia.

Nic więc nie stoi na przeszkodzie, aby jedno polecenie wywoływało wiele (a nawet nie) zdarzeń.

Euforyk
źródło