Ncqrs воссоздает полную ReadModel

Используя Ncqrs, есть ли способ воспроизвести каждое событие (все типы агрегатов) и передать их через мои денормализаторы, чтобы воссоздать всю модель чтения с нуля?

Редактировать:

Хотя было бы неплохо представить более конкретный вариант использования. Я строю это внутри приложения ASP.NET MVC и использую Entity Framework (сначала код) для работы с моделями чтения. Чтобы ускорить разработку (и потому что я ленив), я хочу использовать инициализатор базы данных, который воссоздает схемы базы данных при изменении любой прочитанной модели. Затем с помощью начального метода инициализатора, чтобы заполнить их.

3 ответа

Решение

В итоге я сделал следующее. При запуске службы, перед обработкой каких-либо команд, если модель чтения изменилась, я выбрасываю ее и воссоздаю с нуля, обрабатывая все прошлые события в моих денормализаторах. Это делается в методе инициализации базы данных.

Это была тривиальная задача с использованием хранилища событий MS SQL, так как существовал метод для извлечения всех событий. Однако я не уверен насчет других хранилищ событий.

Мы используем MsSqlServerEventStore, чтобы воспроизвести все события, я реализовал следующий код:

var myEventBus = NcqrsEnvironment.Get<IEventBus>();
if (myEventBus == null) throw new Exception("EventBus is not found in NcqesEnvironment");
var myEventStore = NcqrsEnvironment.Get<IEventStore>() as MsSqlServerEventStore;
if (myEventStore == null) throw new Exception("MsSqlServerEventStore is not found in NcqesEnvironment");
var myEvents = myEventStore.GetEventsAfter(GetFirstEventIdFromEventStore(), int.MaxValue);
myEventBus.Publish(myEvents);

Это подтолкнет все события на шину событий, и денормализаторы обработают все события. Функция GetFirstEventIdFromEventStore просто запрашивает хранилище событий и возвращает первый идентификатор из хранилища событий (где SequentialId = 1)

К сожалению, нет ничего встроенного, чтобы сделать это для вас (хотя я давно не обновлял версию ncqrs, которую я использую, так что, возможно, она изменилась). Это также несколько нетривиально, поскольку это зависит от того, что именно вы хотите сделать.

То, как я это сделал (до этого момента у меня не было необходимости), было бы:

  • Позвоните в магазин событий, чтобы получить все соответствующие события

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

  • Воссоздайте модель чтения в памяти с нуля (чтобы сохранить медленную и ненужную запись)

  • Сохраните воссозданную модель чтения вместо существующей

  • Позвоните в магазин событий еще раз, чтобы узнать о событиях, которые могли быть пропущены.

  • Повторяйте до тех пор, пока не будут возвращены новые события

Стоит отметить, что если вы воссоздаете всю базу данных модели чтения с нуля, я временно отключу службу или поставлю в очередь новые события, пока вы не закончите.

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

Другие вопросы по тегам