2

Mongo経由でサブスクリプション サービスを作成できるかどうか疑問に思っていましたGet Event Store。おそらく私はこれを間違って表現しましたが、説明させてください。Mongo Database現在、イベントをusingに書き込むプロセスがありますNEventStore。私がやりたいのは、にサブスクライブするサブスクリプション サービスを用意することStreamですMongo

特にこれについてインターウェブ上で何も見つけることができませんでしたが、これは可能ですか? 一言で言えば、私の質問はおそらく、2つを組み合わせて一致させることができますか、またはこれを行うには、イベントを書く必要があり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 を介して mongo データベースにイベントを書き込みます

    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();
    }
    
4

1 に答える 1

2

この場合の通常のイベント フローは次のようになります。

(すべてがインストールされ、実行されていると仮定します...)

  1. アプリケーション コードの GetEventStore でサブスクライバーをストリームに登録します。
  2. イベントをストリームに保存する
  3. イベントがサブスクライバーに表示されます

物事の流れを混乱させているか、まったくサポートされていないことをしようとしていると思います (MongoDb サブスクライバーを GetEventStore に持つなど)。あなたのコードがやっていることは次のとおりです

  1. MongoDb に保存するための NEventStore の設定
  2. 「mongodb://localhost:27017/Test」という GetEventStore のストリームをサブスクライブする
  3. イベントを MongoDb に保存する

私が見る限り、イベントを GetEventStore に保存していないため、 EventAppeared メソッドに何も表示されません。MongoDb に保存しています。

[アップデート]

Mongodb ストリームをサブスクライブして GetEventStore にデータを入力したいのですが、これはあなたの回答から収集したものからは不可能だと思います。

MongoDb にはストリームがなく、コレクションがあります。これはドキュメント データベースです。ストリームは GetEventStore の概念です。ただし、NEventStore を使用すると、メッセージ ディスパッチャーを接続できるように見えます。これは、おそらくイベントをリッスンするハンドラーを登録できることを意味します。これらのハンドラーで、GetEventStore に保存できます。

于 2016-08-05T13:24:15.897 に答える