Frage

Stack-Überlauf-Domain Problem Unter der Annahme, und die folgende Definition der Ereignisse:

UserRegistered(UserId, Name, Email)
UserNameChanged(UserId, Name)
QuestionAsked(UserId, QuestionId, Title, Question)

den folgenden Zustand der Ereignisspeicher Angenommen (in der Reihenfolge des Erscheinens):

1) UserRegistered(1, "John", "john@gmail.com")
2) UserNameChanged(1, "SuperJohn")
3) UserNameChanged(1, "John007")
4) QuestionAsked(1, 1, "Help!", "Please!")

Unter der Annahme der folgenden denormalized Lesemodell für Fragen Auflistung (für die erste Seite von SO):

QuestionItem(UserId, QuestionId, QuestionTitle, Question, UserName)

Und die folgenden Event-Handler (die Lese Modell denormalized Builds):

public class QuestionEventsHandler
{
    public void Handle(QuestionAsked question)
    {
        var item = new QuestionItem(
            question.UserId, 
            question.QuestionId, 
            question.Title, 
            question.Question, 
            ??? /* how should i get name of the user? */);
        ...
    }
}

Meine Frage ist , wie ich den Namen des Benutzers finden , die eine Frage gestellt? Oder häufiger: Wie soll ich behandeln Ereignisse, wenn meine denormalisierter Lese Modell zusätzliche Daten benötigt, die nicht in dem speziellen Fall besteht, wird

?

Ich habe vorhandene Proben von CQRS geprüft einschließlich SimpleSQRS von Greg Young und Fohjin Probe von Mark Nijhof. Aber es scheint mir, dass sie arbeiten nur mit Daten, die in den Ereignissen enthalten ist.

War es hilfreich?

Lösung

bereichert einfach die Veranstaltung mit allen notwendigen Informationen.

Greg Ansatz, wie ich mich erinnere, -. Bereichern die Veranstaltung beim Erstellen und Speichern / veröffentlichen es auf diese Art und Weise

Andere Tipps

Ich persönlich denke, es ist nichts falsch mit der Suche den Namen des Benutzers aus dem Event-Handler auf. Aber wenn man in der Lage, in dem Sie den Namen nicht aus dem Benutzerhandbuch Lesemodell abfragen können, dann würde ich ein zusätzlichen Event-Handler QuestionEventsHandler einzuführen, das UserRegistered Ereignis behandeln.

Auf diese Weise die QuestionEventsHandler sein eigenes Repository von Benutzernamen beibehalten konnte (Sie würden die Benutzer E-Mail nicht brauchen zu speichern). Der QuestionAsked Handler kann dann den Namen des Benutzers abfragen direkt von ihr eigenes Repository ist (wie Rinat Abdullin der Speicher ist billig!).

Neben seit Ihrem QuestionItem lesen Modell den Namen des Benutzers hält, würden Sie müssen das UserNameChanged Ereignis innerhalb des QuestionEventsHandler zu handhaben als auch das Namensfeld im QuestionItem, um sicherzustellen, ist up-to-date.

Für mich scheint dies weniger Aufwand als ‚die Ereignisse zu bereichern‘ und hat den Vorteil der nicht Gebäude Abhängigkeiten von anderen Teilen des Systems und deren Lesemodelle.

Pull Ereignisse aus dem EventStor.

Denken Sie daran - Ihre Lese Modelle haben müssen Lesezugriff auf die EventStor bereits. Lesen Modelle sind Einweg. Sie sind einfach Ansichten zwischengespeichert. Sie sollen Ihre lesen Model jederzeit löschen / ablaufen können - und automatisch ReadModels vom EventStor wieder aufzubauen. Also -. Ihre ReadModelBuilders muss bereits in der Lage sein, zu Abfrage für vergangene Ereignisse

public class QuestionEventsHandler
{
    public void Handle(QuestionAsked question)
    {
        // Get Name of User
        var nameChangedEvent = eventRepository.GetLastEventByAggregateId<UserNameChanged>(question.UserId);

        var item = new QuestionItem(
            question.UserId, 
            question.QuestionId, 
            question.Title, 
            question.Question, 

            nameChangedEvent.Name
    }
}

Auch realisieren - das EventStor Repository muss nicht die wahren EventStor sein, obwohl es könnte sicherlich sein. Der Vorteil von verteilten Systemen ist, dass man leicht die EventStor replizieren kann, wenn Sie benötigt wird, näher an Ihre ReadModels.

Ich traf genau dieses gleiche Szenario ... wo ich mehr Daten benötigt, als in einem einzigen Ereignisse zur Verfügung stand. Dies gilt insbesondere für Create-Typen Ereignisse, die einen neuen ReadModel mit Anfangszustand erfordern bevölkern.

Von Read-Modelle: Sie sind von anderen lesen Models ziehen konnte. Aber ich weiß nicht wirklich empfehlen, da Sie eine große Kugel von Abhängigkeits Schlamm einführen würden, wo Ansichten über Ansichten hängen hängen von Ansichten.

Weitere Daten in Events: Sie wirklich nicht wollen, dass Ihre Veranstaltungen mit allen zusätzlichen Daten aufblasen Sie Ansichten benötigen. Es wird weh tun Sie wirklich, wenn Ihre Domain Änderungen und Sie müssen Ereignisse migrieren. Domain Events haben einen bestimmten Zweck - sie Zustandsänderungen darstellen. Nicht sehen Daten.

Hope this helps -

Ryan

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top