Ncqrs воссоздает полную ReadModel - PullRequest
1 голос
/ 14 сентября 2011

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

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

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

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Мы используем 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)

2 голосов
/ 21 сентября 2011

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

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

  • Вызов в хранилище событий для получения всех соответствующих событий

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

  • Повторное создание модели чтения в памяти с нуля (для сохранения медленной и ненужной записи)

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

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

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

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

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

1 голос
/ 21 сентября 2011

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

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

...