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, которую я использую, так что, возможно, она изменилась). Это также несколько нетривиально, поскольку это зависит от того, что именно вы хотите сделать.
То, как я это сделал (до этого момента у меня не было необходимости), было бы:
- Позвоните в магазин событий, чтобы получить все соответствующие события
В зависимости от того, что вы делаете, это могут быть все события или только события для одного совокупного корня или подмножество событий для одного или нескольких совокупных корней.
Воссоздайте модель чтения в памяти с нуля (чтобы сохранить медленную и ненужную запись)
Сохраните воссозданную модель чтения вместо существующей
Позвоните в магазин событий еще раз, чтобы узнать о событиях, которые могли быть пропущены.
Повторяйте до тех пор, пока не будут возвращены новые события
Стоит отметить, что если вы воссоздаете всю базу данных модели чтения с нуля, я временно отключу службу или поставлю в очередь новые события, пока вы не закончите.
Опять же, есть разные способы решения этой проблемы, ваша архитектура и сценарии, вероятно, будут определять, как лучше всего это сделать.