Подключение EventStore JOliver с помощью модуля постоянства RavenDB - PullRequest
5 голосов
/ 26 мая 2011

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 26 мая 2011

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

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

Wireup.Init()
.UsingRavenPersistence("EventStore", new DocumentObjectSerializer())
.UsingSynchronousDispatcher()
.PublishTo(new DelegateMessagePublisher(c => PublishMessages(c))
.Build();
2 голосов
/ 09 января 2012
private IStoreEvents GetInitializedEventStore(IDispatchCommits bus)
    {
        return Wireup.Init()
            .UsingRavenPersistence(BootStrapper.RavenDbEventStoreConnectionStringName)
            .UsingAsynchronousDispatchScheduler(bus)
            .Build();
    }
...