Warum sind die Befehle und Veranstaltungen GESONDERT dargestellt?
Was ist der Unterschied zwischen Befehlen und Ereignissen in der Architektur unterstreichen, dass Veranstaltungen? Der einzige Unterschied, den ich sehen kann, ist, dass die Befehle sind in der Regel bezogen/ausgelöst durch Akteure außerhalb des Systems, in der Erwägung, dass Ereignisse zu sein scheinen, stammen von Handlern und anderen code in einem system. Doch in vielen Beispiel-Anwendungen, die ich gesehen habe, haben Sie verschiedene (aber funktional ähnlichen) interfaces.
- Es hängt sehr stark, was du genau im Sinn haben, wenn Sie die Worte "Befehl" und "Ereignis".
- Nehmen Sie Ihre typische CQRS/DDD-Projekt als ein Beispiel.
- Mein Verständnis: die Befehle, die verarbeitet werden müssen, um genau einen Empfänger (die kann ablehnen, dem Befehl), und Ereignisse können verarbeitet werden durch 0...n Receiver.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Befehle abgelehnt werden kann.
Ereignisse geschehen.
Dies ist wahrscheinlich der wichtigste Grund. In einer event-driven architecture, da gibt es keine Frage, dass ein Ereignis ausgelöst repräsentiert etwas, dass passiert.
Nun, da Befehle sind etwas, das wir wollen geschehen, und die Ereignisse sind etwas, das hat passiert ist, sollten wir mit anderen Verben, wenn wir die Namen dieser Dinge. Das treibt die separaten Darstellungen.
Dies ist ein weiterer Grund, den Sie vertreten, getrennt. Konzeptionelle Klarheit.
Befehle und Ereignisse sind in den beiden Nachrichten. Aber Sie sind in der Tat separate Konzepte und Begriffe sollen explizit modelliert werden.
Auch, zusätzlich zu all den Antworten, die hier ausgesetzt ist, wird ein Ereignis-handler in der Lage sein kann, die zum auslösen eines Befehls als auch nach Erhalt der Benachrichtigung, dass ein Ereignis aufgetreten ist.
Zum Beispiel sagen, dass, nachdem Sie einen Kunden erstellen, können Sie auch wollen, initialisieren Sie einige Konten, Werte, etc. Nachdem der Kunde AR fügen Sie den Fall zu den EventDispatcher und das empfangen wird durch eine CustomerCreatedEventHandler Objekt, diese Prozedur kann trigger eine Absendung einer Befehl der ausgeführt wird, was Sie brauchen, etc.
Außerdem gibt es DomainEvents und ApplicationEvents. Der Unterschied ist einfach konzeptionell. Sie wollen bis zum Versand alle Ihre domain-Ereignisse zuerst (einige von Ihnen produzieren Application-Ereignisse). Was ich damit meine?
Initialisieren Sie ein Konto nach einem CustomerCreatedEvent aufgetreten ist, ist ein DOMAIN-Ereignis. Senden Sie eine E-Mail-Benachrichtigung an den Kunden ist eine Anwendung, die Event.
Der Grund, warum Sie sollten nicht mischen Sie klar ist. Wenn Ihr SMTP-server ist vorübergehend down ist, bedeutet das nicht, dass Ihr DOMAIN-OPERATION berührt. Sie immer noch wollen, zu halten, eine nicht-fehlerhaften Zustand Ihrer Aggregate.
Ich in der Regel fügen Sie Ereignisse, mein Disponent in der Aggregate-Root-Ebene. Diese Ereignisse sind entweder DomainEvents oder ApplicationEvents. Kann beides sein und kann viele von Ihnen. Sobald mein command-handler ist getan und ich bin wieder in den stack der code, der den Befehl ausführen handler, dann überprüfe ich meine Dispatcher und Versand sonstige DomainEvent. Wenn all dies erfolgreich ist, dann schließe ich die Transaktion.
Wenn ich eine Anwendung Ereignisse, ist dies der Zeitpunkt der Versendung. Senden Sie eine E-Mail muss nicht unbedingt eine offene Verbindung zu einer Datenbank noch einen Transaktionsbereich öffnen.
Ich davon abgekommen ein wenig von der ursprünglichen Frage, aber es ist auch wichtig für Sie zu verstehen, wie Ereignisse können sich auch konzeptionell anders behandelt.
Dann müssen Sie Sagen.... aber das ist WAYYYY AUS dem Rahmen dieser Frage 🙂
Macht es Sinn?
Nach der Arbeit durch manche Beispiele und vor allem das von Greg Young-Präsentation (http://www.youtube.com/watch?v=JHGkaShoyNs) ich bin zu dem Schluss gekommen, dass die Befehle redundant sind. Sie sind einfach Ereignisse aus Ihrer Benutzer, Sie haben diese Taste drücken. Speichern Sie diese in genau der gleichen Weise wie andere Veranstaltungen, weil es sich um Daten handelt und Sie nicht wissen, wenn Sie verwenden möchten, werden es in Zukunft anzeigen. Ihre Nutzer noch hinzufügen und dann später entfernen Sie das Element aus dem Warenkorb oder zumindest versuchen. Sie können später verwenden Sie diese Informationen, um den Benutzer zu erinnern, diese zu einem späteren Zeitpunkt.
Vertreten werden Sie separetly, weil Sie sind sehr unterschiedliche Dinge.
Wie @qstarin Sprach-Befehle sind Nachrichten, die abgelehnt werden kann, und dass bei Erfolg wird ein event.
Befehle und Ereignisse sind Dtos, Sie sind Nachrichten, und Sie neigen dazu, sehr ähnlich Aussehen, wenn die Erstellung und Person, jedoch ab dann nicht unbedingt.
Wenn Sie besorgt über die Wiederverwendung, dann könnten Sie nutzen Befehle und Ereignisse, die als Umschläge für Ihre (messge) Nutzlast
jedoch, was ich d gerne wissen, warum du fragst 😀 ie haben Sie zu viele Befehle/events?
Neben der konzeptionellen Unterschiede oben erwähnt, ich denke, es ist ein weiterer Unterschied bezieht sich auf übliche Implementierungen:
Ereignisse werden in der Regel verarbeitet werden, eine hintergrund-Schleife, muss Umfrage das Ereignis Warteschlangen. Jede Partei daran interessiert, handeln Sie auf das Ereignis, in der Regel, registrieren Sie einen Rückruf, der aufgerufen wird, als ein Ergebnis der Ereignis-queue Verarbeitung. So ein Ereignis kann man sich zu vielen.
Befehle können nicht verarbeitet werden müssen in einer solchen Weise. Der Urheber der Befehl wird in der Regel Zugang zu den beabsichtigten Vollzieher des Befehls. Dies könnte zum Beispiel in form einer message-queue executor. So ein Befehl ist bestimmt für eine single Person.
Denke ich etwas hinzufügen quentin-santin Antwort ist, dass Sie:
Quelle.
Den Veranstaltung ist eine Tatsache aus der Vergangenheit.
Den Befehl ist nur eine Anfrage und kann somit verweigert werden.