接线JOliver';使用RavenDB Persistence插件的EventStore

本文关键字:Persistence 插件 EventStore RavenDB 使用 JOliver 接线 | 更新日期: 2023-09-27 17:57:36

我正在评估JOliver的EventStore库。特别是,我正在尝试使用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"吗?或者有更好的方法在EventStore中连接RavenDB持久性吗?

接线JOliver';使用RavenDB Persistence插件的EventStore

嗯。好吧,我认为raven没有实现PersistenceWireup的原因是b/c接口公开了文档存储实现不使用的ISerializer特定方法。我们可能需要将initialize移到Wireup。我会调查的。

但是,我发现您缺少将在存储后调度事件的调度器。这是故意的吗?如果您不打算从另一个enpoint发布,请添加Synchronous/Asynchronous调度器。调度程序当前正在调用initialize。

Wireup.Init()
.UsingRavenPersistence("EventStore", new DocumentObjectSerializer())
.UsingSynchronousDispatcher()
.PublishTo(new DelegateMessagePublisher(c => PublishMessages(c))
.Build();
private IStoreEvents GetInitializedEventStore(IDispatchCommits bus)
    {
        return Wireup.Init()
            .UsingRavenPersistence(BootStrapper.RavenDbEventStoreConnectionStringName)
            .UsingAsynchronousDispatchScheduler(bus)
            .Build();
    }