CQRS: я должен использовать другое событие для чтения модели? - PullRequest
0 голосов
/ 07 октября 2019

У меня уже есть проект с CQRS и Event Sourcing. Теперь я собираюсь реализовать модель чтения.

На данный момент событие ProductCreated имеет EventID и ID продукта. Но для модели чтения я хочу использовать разные поля - Имя продукта и категорию.

В этом случае мне нужно добавить Имя продукта и категорию в событие ProductCreated или создать другое событие только симя и категория для модели чтения?

Я новичок в CQRS и Event Sourcing. Я потратил целый день на поиск ответа на этот вопрос, но не смог найти правильного решения.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 07 октября 2019

Просто

Если у вас есть выделенная модель чтения, она обязательно должна иметь ProductID, а также ProductName и Category.

Почему?

Просто потому, что если кто-то запросит эту модель, скажем, некоторый клиентский интерфейс клиента или API-клиент без идентификатора, он не сможет отследить, какой именно продукт вы вернули, поскольку ProductName может быть одинаковым длянесколько продуктов.

В этом случае нужно ли добавить имя продукта и категорию к событию ProductCreated или создать другое событие с именем и категорией только для модели чтения?

Гадание по названию события ProductCreated - это событие, содержащее информацию о том, что Продукт был создан. Это действительно зависит от потребностей вашего бизнеса и вашего дизайна, но я бы предложил поместить всю информацию о модели продукта (по крайней мере, свойства, которые должны быть общедоступными) в событие ProductCreated. Это может быть ProductId, ProductName, ProductCategory и некоторые другие (если у вас есть что-то вроде ProductDescription, ProductCode и всего, что находится в модели Product).

Кто бы ни слушал это событие, он мог решить, хотят ли они сохранитьвся модель в их хранилище или просто подмножество этой модели. Это, конечно, основано на потребностях конкретного потребителя события.

Этот подход хорош, если у вас есть или у вас в будущем будет несколько потребителей публикуемого вами события. Если нет, и у вас есть только 1, вы можете удалить свойства, которые вам не нужны в модели чтения.

Заключение

Вам не нужна секундасобытие для передачи подмножества данных, как вы описали. Я бы посоветовал поместить все в событие ProductCreated, а затем в вашу модель чтения при обработке этого события сохранить только подмножество данных, которые вам там нужны.

1 голос
/ 07 октября 2019

Есть ли где-нибудь таблица соответствия, которая отображает идентификатор продукта на имя и категорию? Если это так, используйте эту таблицу в своей модели чтения.

Или эта информация предоставляется во время создания продукта тем, кто его создает? Если это так, вам обязательно нужно добавить его к событию, иначе вы потеряете эту информацию.

...