2016-07-30 23 views
0

Welche Optionen gibt es, um ein Ereignis zu validieren, das ein anderes Modell verwendet?Validierung mit anderen Modellen

Einkaufswagen Beispiel:

Wenn ein Wagen Artikel in den Warenkorb legen, sollte es eine Prüfung, wenn der Artikel noch nicht ausverkauft ist.

+0

Ereignisse im Ereignis Sourcing Sinn des Begriffs kann nicht validiert werden, sie sind bereits passiert. – guillaume31

Antwort

4

würden Sie in der Regel einen Befehl bestätigen, statt ein Ereignis als ein Ereignis sollte etwas sein, das nicht

In Antwort auf die Frage geändert werden kann, hängt es in der Regel auf das, was die Geschäftskosten des Verfahrens ist. In Ihrem Beispiel zum Beispiel, was kostet das Geschäft, einen Artikel zu bestellen, der ausverkauft ist? Wahrscheinlich sehr wenig - eine E-Mail, die sagt, dass der Artikel nicht mehr auf Lager ist, mit einer Schätzung, wie lange es dauern wird.

In dieser Art von Szenario könnten Sie ein eventuell konsistentes Lesemodell über die Daten verwenden, bei dem Sie das Lesemodell/den Cache nach Lagerbeständen abfragen, aber akzeptieren, dass einige Aufträge für nicht verfügbare Lagerbestände durchgehen .

Wenn Sie engere Einschränkungen haben, müssen Sie sie erzwingen, idealerweise durch Umgestaltung Ihrer Aggregate oder Transaktions- und/oder Blockierungsvorgänge im Bestellprozess.

1

Welche Optionen gibt es, um ein Ereignis zu validieren, das ein anderes Modell verwendet?

Eine domain event ist ein wichtiges Ereignis aus der Sicht des Geschäfts. Es ist etwas, das in der Vergangenheit passiert, also kann es nicht geändert werden. In OO wird es normalerweise als Value Object dargestellt, das heißt, ein unveränderliches Objekt, wo der interessante Teil ihre Attribute sind.

Üblicherweise sind diese Domain Events Ausbeute von einer Operation in einem Aggregate Root (DDD Jargon). Der Client der Aggregate Root ist der Application Service (alias Use Case). Die Application Service erhalten ein Command Objekt und Basis darauf, führt die Operation in der Aggregate Root.

Die Validierung könnte in primitiver Validierung, Objektvalidierung und/oder zusammengesetzter Objektvalidierung bestehen. Dann sollte das Objekt, das diese Validierung durchführen soll, die Aggregate Root selbst und/oder einige Objekte mit dem spezifischen Ziel in der Validierung sein.

Wenn ein Wagen Artikel in den Warenkorb hinzufügen, sollte es eine Prüfung sein , wenn der Artikel aus noch nicht verkauft wird

Nach Ihrem Beispiel woulb die Objekte sein:

  • Befehl: AddItemToShoppingCartCommand. Enthält Informationen über den hinzuzufügenden Artikel und beispielsweise eine Einkaufswagen-ID.
  • Anwendungsdienst: AddItemToShoppingCartService.
  • Aggregatwurzel: ShoppingCartInventory. Ich habe absichtlich Inventory im Namen verwendet, um explizit zu sein, dass diese Aggregate Root die Invariante "... erfüllen, wenn der Artikel noch nicht ausverkauft ist."

Hinweis: Meiner Meinung nach ist die Invariante, die das Inventar in den Aggregate Root prüft, macht die Aggregate zu groß Mein Rat ist, diese Invarianten entspannen und Eventual Consistency umarmen, wenn diese.‚Ausverkauft‘es ist nicht normal passieren