2016-08-05 103 views
1

我想知道是否有可能通過Get Event Store創建訂閱服務Mongo?也許我誤解了這句話,但讓我解釋一下。我目前有一個使用NEventStore將事件寫入Mongo Database的過程。我想要做的是訂閱StreamMongo訂閱服務。Event Store訂閱服務MongoDB

無法在interweb上找到任何關於此的內容,但這是可能的嗎?簡而言之,我的問題可能是你可以將兩者混合在一起,或者爲了做到這一點,我必須將我的活動寫入eventstore而不是Mongo?也許,我正在談論這個錯誤,並且有另一種選擇?

我可以看到我正在編寫的事件,但無法觸發EventAppeared。所有這些都是在我的機器上進行的。

我試圖創建一個精簡的應用程序,它做到這一點:

  1. 使用以下

    using (var connection = EventStoreConnection.Create(new IPEndPoint(IPAddress.Loopback, 1113))) 
        { 
         connection.SubscribeToStreamAsync(@"mongodb://localhost:27017/Test", false, EventAppeared, SubscriptionDropped); 
    
         var repository = new NEventStoreRepository(); 
         repository.Write(new SomethingHasHappened("Hello")); 
    
         Console.ReadLine(); 
        } 
    
    private static void SubscriptionDropped(EventStoreSubscription arg1, SubscriptionDropReason arg2, Exception arg3) 
    { 
    } 
    
    private static void EventAppeared(EventStoreSubscription arg1, ResolvedEvent arg2) 
    { 
    } 
    
  2. 我通過NEventStore將事件寫入我的蒙戈數據庫

    創建訂閱
    public void Write(object @event) 
    { 
        var id = Guid.NewGuid(); 
    
        using (var scope = new TransactionScope()) 
        { 
         using (var store = WireupEventStore()) 
         { 
          using (var stream = store.OpenStream(id.ToString(), 0, int.MaxValue)) 
          { 
           stream.Add(new EventMessage { Body = @event }); 
           stream.CommitChanges(Guid.NewGuid()); 
           scope.Complete(); 
          } 
         } 
        } 
    
        Console.ReadKey(); 
    } 
    
    private static IStoreEvents WireupEventStore() 
    { 
        return Wireup 
         .Init() 
         .LogToOutputWindow() 
         .UsingMongoPersistence("NEventStore.MongoDB", new DocumentObjectSerializer()) 
         .InitializeStorageEngine() 
         .UsingJsonSerialization() 
         .Build(); 
    } 
    
+0

你在說GetEventStore嗎? – tomliversidge

+0

道歉,是的。 –

+0

您已將您的mongodb連接作爲GetEventStore中事件流的名稱。這是故意的嗎?您的流實際上是否稱爲「mongodb:// localhost:27017/Test」? – tomliversidge

回答

1

事件造成這種情況的正常流動將如下:

(放棄一切已安裝並運行...)

  1. 註冊用戶在GetEventStore流在 應用程序代碼
  2. 保存事件流
  3. 的事件出現在你的用戶

我認爲你要麼混淆的東西Ø流試圖做一些完全不受支持的事情(比如讓MongoDb訂閱者訪問GetEventStore)。我認爲你的代碼做的是:

  1. 設置NEventStore保存到MongoDB的
  2. 訂閱在GetEventStore流稱爲 「MongoDB的://本地主機:27017 /測試」
  3. 的保存事件到MongoDb

據我所見,你永遠不會保存任何事件給GetEventStore,因此爲什麼在EventAppeared方法中什麼也沒有出現。您正在保存到MongoDb。

[更新]

我要訂閱的MongoDB流和填充GetEventStore我相信這是不可能的,從我從你的答案收集。

MongoDb沒有流,它有集合 - 它是一個文檔數據庫。流是GetEventStore中的一個概念。但是,它看起來像NEventStore允許你連接一個消息調度程序,這可能意味着你可以註冊處理程序來監聽事件。在這些處理程序中,您可以保存到GetEventStore。

+0

我相信你已經回答了我的問題。然而,我想訂閱一個Mongodb流並填充GetEventStore,我認爲這不可能從我的答案中得到。 –

+0

您必須掛鉤NEventStore使用的任何機制以允許您訂閱事件,然後在您的處理程序中,保存到EventStore:https://github.com/NEventStore/NEventStore-Example/blob/master/NEventStore.Example/MainProgram.cs#L55。 – tomliversidge

+0

乾杯的幫助感謝。它覺得我在做什麼是錯的,但想證實這一點。我有另一種方法,我知道會工作(基本上你在答案中提到的) –