Nehmen wir ein einfaches Beispiel für die "Kontoregistrierung". Hier ist der Ablauf:
- Benutzer besuchen Website
- Klicken Sie auf die Schaltfläche "Registrieren" und füllen Sie das Formular aus. Klicken Sie auf die Schaltfläche "Speichern"
- MVC Controller: Überprüfen Sie die Eindeutigkeit von Benutzernamen, indem Sie aus ReadModel lesen
- RegisterCommand: Überprüfen Sie die Eindeutigkeit des Benutzernamens erneut (hier ist die Frage).
Natürlich können wir die Eindeutigkeit von Benutzernamen überprüfen, indem wir von ReadModel in MVC Controller lesen, um die Leistung und Benutzererfahrung zu verbessern. Allerdings müssen wir noch die Einzigartigkeit wieder in RegisterCommand zu validieren , und natürlich sollten wir nicht den Zugang ReadModel in Befehle.
Wenn wir Event Sourcing nicht verwenden, können wir das Domänenmodell abfragen, sodass dies kein Problem darstellt. Wenn wir jedoch Event Sourcing verwenden, können wir das Domänenmodell nicht abfragen. Wie können wir also die Eindeutigkeit von Benutzernamen in RegisterCommand überprüfen?
Hinweis: Die Benutzerklasse verfügt über eine Id-Eigenschaft, und UserName ist nicht die Schlüsseleigenschaft der User-Klasse. Wir können das Domänenobjekt nur bei Verwendung der Ereignisbeschaffung anhand der ID abrufen.
Übrigens: Wenn der eingegebene Benutzername bereits vergeben ist, sollte auf der Website dem Besucher die Fehlermeldung "Entschuldigung, der Benutzername XXX ist nicht verfügbar" angezeigt werden. Es ist nicht akzeptabel, dem Besucher eine Nachricht mit der Aufschrift "Wir erstellen Ihr Konto, bitte warten Sie, wir senden Ihnen das Registrierungsergebnis später per E-Mail" zu zeigen.
Irgendwelche Ideen? Danke vielmals!
[AKTUALISIEREN]
Ein komplexeres Beispiel:
Anforderung:
Wenn Sie eine Bestellung aufgeben, sollte das System die Bestellhistorie des Kunden überprüfen. Wenn er ein wertvoller Kunde ist (wenn der Kunde im letzten Jahr mindestens 10 Bestellungen pro Monat aufgegeben hat, ist er wertvoll), erhalten Sie 10% Rabatt auf die Bestellung.
Implementierung:
Wir erstellen PlaceOrderCommand und müssen im Befehl den Bestellverlauf abfragen, um festzustellen, ob der Client wertvoll ist. Aber wie können wir das machen? Wir sollten nicht im Befehl auf ReadModel zugreifen! Wie Mikael sagte , können wir im Beispiel für die Kontoregistrierung Kompensationsbefehle verwenden. Wenn wir diese jedoch auch in diesem Bestellbeispiel verwenden, wäre dies zu komplex und der Code möglicherweise zu schwierig zu pflegen.