MongoDB的Event Store订阅服务

时间:2016-08-05 07:38:45

标签: c# neventstore get-event-store

我想知道是否可以通过MongoGet Event Store创建订阅服务?也许我的说法不正确,但让我解释一下。我目前有一个使用Mongo Database将事件写入NEventStore的流程。我想要做的是订阅服务,订阅Stream中的Mongo

特别是在这个网络上没有找到任何关于此的内容,但是这可能吗?简而言之,我的问题可能是你可以将两者混合在一起,或者为了做到这一点我必须把我的事件写到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();
    }
    

1 个答案:

答案 0 :(得分:1)

此事件的正常流程如下:

(鉴于所有内容已安装并正在运行......)

  1. 将订阅者注册到您的GetEventStore中的流 应用程序代码
  2. 将事件保存到流
  3. 活动会显示在您的订阅者中
  4. 我认为你要么混淆事物的流程,要么试图做一些完全不受支持的事情(比如让MongoDb订阅者加入GetEventStore)。我认为您的代码正在做的是:

    1. 设置NEventStore以保存到MongoDb
    2. 订阅GetEventStore中名为“mongodb:// localhost:27017 / Test”的流
    3. 将事件保存到MongoDb
    4. 据我所知,你永远不会将任何事件保存到GetEventStore,因此为什么没有出现在EventAppeared方法中。你要保存到MongoDb。

      [UPDATE]

        

      我想订阅一个Mongodb流并填充GetEventStore,我认为这不可能从我从你的回答中收集到的内容。

      MongoDb没有流,它有集合 - 它是一个文档数据库。 Streams是GetEventStore中的一个概念。但是,看起来NEventStore允许您连接一个消息调度程序,这可能意味着您可以注册处理程序来监听事件。在这些处理程序中,您可以保存到GetEventStore。