Служба подписки на хранилище событий в MongoDB

Мне было интересно, если бы было возможно создать службу подписки на Mongo с помощью Get 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

    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 ответ

Решение

Обычный поток событий для этого будет следующим:

(учитывая, что все установлено и работает...)

  1. Зарегистрируйте подписчика на поток в GetEventStore в коде вашего приложения
  2. Сохранить события в потоке
  3. События появляются в вашем подписчике

Я думаю, что вы либо путаете ход вещей, либо пытаетесь сделать что-то совершенно неподдерживаемое (например, иметь подписчика MongoDb на GetEventStore). Я думаю, что ваш код делает:

  1. Настройка NEventStore для сохранения в MongoDb
  2. Подписка на поток в GetEventStore с именем "mongodb://localhost:27017/Test"
  3. Сохранение события в MongoDb

Насколько я вижу, вы никогда не сохраняете какие-либо события в GetEventStore, поэтому в методе EventAppeared ничего не появляется. Вы сохраняете в MongoDb.

[ОБНОВИТЬ]

Я хочу подписаться на поток Mongodb и заполнить GetEventStore, что, по моему мнению, невозможно из того, что я понял из вашего ответа.

MongoDb не имеет потоков, у него есть коллекции - это база данных документов. Потоки являются концепцией в GetEventStore. Однако, похоже, что NEventStore позволяет вам подключить диспетчер сообщений, что, вероятно, означает, что вы можете зарегистрировать обработчики для прослушивания событий. В этих обработчиках вы можете затем сохранить их в GetEventStore.

Другие вопросы по тегам