2011-05-25 69 views
5

我正在评估JOliver's EventStore库。特别是,我试图使用RavenDB作为EventStore的持久性引擎。 EventStore为此提供了一个插件。注意:数据库是空的,没有索引(默认值除外)。使用RavenDB Persistence Plugin连接JOliver的EventStore

在接线,商店,我用下面的:

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

然而,当我运行我的程序,我得到一个异常,表示无法找到“RavenCommitByRevisionRange”指数。

在围绕EventStore代码挖,我觉得这个问题恰好是该RavenPersistenceEngine没有被初始化。初始化代码在RavenDB服务器中安装所需的索引。

对事物的SQL服务器端,我注意到,在示例项目的配线代码显示了称为扩展方法的调用:“InitializeStorageEngine”。此扩展方法与类“PersistenceWireup”绑定。但是,我在RavenDB持久性中使用的扩展方法返回类“Wireup”。所以,我的包裹在一个新的PersistenceWireup比如我wireup代码的一部分,并能够称之为“.InitializeStorageEngine()”,例如:

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

这个伟大的工程! RavenDB数据库现在包含必要的索引。

所以......我的问题:不应该“.UsingRavenPersistence(......)”返回‘PersistenceWireup’,而不是简单的‘Wireup’的实例?还是有更好的方法来连接EventStore中的RavenDB持久性?

回答

5

嗯。那么,我认为raven没有实现PersistenceWireup的原因是b/c接口暴露了文档存储实现不使用的ISerializer特定方法。我们可能需要将初始化移动到Wireup。我会研究这个。

但是,我看到您错过了将在存储后调度事件的调度程序。这是故意的吗?如果您不打算从其他设备发布,请添加同步/异步分派器。调度员当前正在调用初始化。

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

感谢您的回答!我明白了Raven不需要序列化程序的含义。是的,我现在确实没有派遣调度员,因为我一次试图将EventStore列出来。但肯定这是下一步。 – 2011-05-26 16:07:14

+0

我已经更新了Raven连线代码以返回一个PersistenceWireup实例。 – 2011-05-26 18:13:15

+0

非常感谢! – 2011-05-31 04:24:54

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