Подключение хранилища событий JOliver с помощью плагина RavenDB Persistence

#c# #.net #ravendb #cqrs #event-sourcing

#c# #.net #ravendb #cqrs #источник событий #поиск событий

Вопрос:

Я оцениваю библиотеку Joliver’s EventStore. В частности, я пытаюсь использовать RavenDB в качестве механизма сохранения для EventStore. EventStore поставляется с плагином для этого. ПРИМЕЧАНИЕ: База данных пуста, без индексов (кроме индексов по умолчанию).

При подключении магазина я использовал следующее:

 var store = Wireup.Init()
    .UsingRavenPersistence("EventStore", new DocumentObjectSerializer())
    .Build();
  

Однако, когда я запускаю свою программу, я получаю исключение, которое указывает на то, что индекс «RavenCommitByRevisionRange» не найден.

Копаясь в коде EventStore, я думаю, что проблема заключается в том, что RavenPersistenceEngine не инициализируется. Код инициализации устанавливает необходимые индексы на сервере RavenDB.

Что касается SQL server, я заметил, что код подключения в примере проекта показывает вызов метода расширения с именем: «InitializeStorageEngine». Этот метод расширения привязан к классу «PersistenceWireup». Однако метод расширения, который я использую для передачи в RavenDB persistence, возвращает класс «Wireup». Итак, я обернул часть своего кода wireup в новый экземпляр PersistenceWireup и смог вызвать «.InitializeStorageEngine()» вот так:

 var store = new PersistenceWireup(
    Wireup.Init()
        .UsingRavenPersistence("EventStore", new DocumentObjectSerializer()))
            .InitializeStorageEngine()
        .Build();
  

Это отлично работает! База данных RavenDB теперь содержала необходимые индексы.

Итак … Мои вопросы: не должен ли «.UsingRavenPersistence(…)» возвращать экземпляр «PersistenceWireup», а не просто «Wireup»? Или есть лучший способ подключить сохранение RavenDB в EventStore?

Ответ №1:

Хммм. Ну, я думаю, что причина, по которой raven не реализует PersistenceWireup, заключается в том, что интерфейс предоставляет специфические методы ISerializer, которые не используются реализациями хранилища документов. Вероятно, нам нужно переместить инициализацию в Wireup. Я рассмотрю это.

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

 Wireup.Init()
.UsingRavenPersistence("EventStore", new DocumentObjectSerializer())
.UsingSynchronousDispatcher()
.PublishTo(new DelegateMessagePublisher(c => PublishMessages(c))
.Build();
  

Комментарии:

1. Спасибо за ответ! Я понимаю, что вы имеете в виду, когда говорите, что сериализатор не нужен для Raven. Да, я пока не упомянул диспетчера, поскольку пытался разобраться с EventStore по частям за раз. Но, безусловно, это следующий шаг.

2. Я обновил код Raven wireup, чтобы возвращать экземпляр PersistenceWireup.

3. это больше не работает. есть ли пример того, как это сделать, используя последнюю версию?

Ответ №2:

 private IStoreEvents GetInitializedEventStore(IDispatchCommits bus)
    {
        return Wireup.Init()
            .UsingRavenPersistence(BootStrapper.RavenDbEventStoreConnectionStringName)
            .UsingAsynchronousDispatchScheduler(bus)
            .Build();
    }