我正在评估JOliver's 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持久性吗?
答案 0 :(得分:5)
嗯。好吧,我认为raven没有实现PersistenceWireup的原因是b / c接口公开了文档存储实现不使用的ISerializer特定方法。我们可能需要将初始化移动到Wireup。我会调查一下。
但是,我发现您错过了将在存储后调度事件的调度程序。这是故意的吗?如果您不打算从另一个角度发布,请添加同步/异步调度程序。调度程序当前正在调用initialize。
Wireup.Init()
.UsingRavenPersistence("EventStore", new DocumentObjectSerializer())
.UsingSynchronousDispatcher()
.PublishTo(new DelegateMessagePublisher(c => PublishMessages(c))
.Build();
答案 1 :(得分:2)
private IStoreEvents GetInitializedEventStore(IDispatchCommits bus)
{
return Wireup.Init()
.UsingRavenPersistence(BootStrapper.RavenDbEventStoreConnectionStringName)
.UsingAsynchronousDispatchScheduler(bus)
.Build();
}