2011-05-25 43 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(); 
    } 
相關問題