Der Unterschied zwischen einem Befehl und einem Ereignis in der Buskommunikation erscheint mir etwas vage. Ich weiß, dass Befehle nur einmal ausgeführt werden sollten, während ein Ereignis mehrmals behandelt werden kann, aber ich bin mir immer noch nicht sicher, wann ich einen Befehl oder ein Ereignis verwenden soll.
Schauen wir uns ein Beispiel an:
Wenn sich ein neuer Benutzer bei einer Webanwendung registriert, sollten wir ihm ein Konto erstellen und eine Bestätigungs-E-Mail senden.
Erstellen des Kontos - Dies scheint der richtige Ort zu sein, um ein KontoCreateUserCommand
an den Bus zu senden und eine spezialisierte Komponente damit umgehen zu lassen.
Oder sollte dies nicht einmal mit einer asynchronen Buskommunikation implementiert werden? Wir möchten, dass sich der Benutzer sofort bei der Anwendung anmelden kann. Mit dem Bus haben wir keine Garantie, wann der Befehl ausgeführt wird.
E-Mail senden - Nachdem die Komponente das Konto erstellt hat, sehe ich zwei Möglichkeiten
- Senden Sie einen weiteren Befehl an den Bus
SendConfirmationEmailCommand
- Veröffentlichen Sie eine Veranstaltung
UserAccountCreatedEvent
Und dann lassen Sie die E-Mail-Absender-Komponente es greifen und zu seinem Job.
Einerseits möchte ich, dass die Bestätigungs-E-Mail nur einmal gesendet wird (verwenden Sie einen Befehl), andererseits glaube ich, dass es mehrere Komponenten geben kann, die an neu registrierten Benutzern interessiert sind. Ein Logger oder vielleicht ein SMS-Absender.
Wie würden Sie es implementieren?