Воспроизведение событий определенного типа - PullRequest
3 голосов
/ 15 июля 2011

Я смотрю на Магазин событий joliver и думаю о воспроизведении событий для нового обработчика событий.Я вижу, что есть метод для получения всех коммитов с определенного момента времени (ICommitStreams.GetFrom (Date)), но я не могу понять, как получить события только определенного типа.

Я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 24 сентября 2012

Просто для справки, вот что я делаю:

var typesToSend = typeof (MyApp.Messages.Events.SomeAggregate.SomeEvent).Assembly
    .GetTypes()
    .Where(t => t.Namespace != null && t.Namespace.StartsWith("MyApp.Messages.Events.SomeAggregate"))
    .ToList();

var commits = eventStore.Advanced.GetFrom(DateTime.MinValue)
    .Where(c => c.Events.Any(e => typesToSend.Contains(e.Body.GetType())))
    .OrderBy(c => c.CommitSequence)
    .ToList();

Как утверждает Джонатан, коммит может содержать более одного события, и он получает все коммиты, которые содержат хотя бы одно из событий, которые я ищу. Для дальнейшей фильтрации вам нужно будет просмотреть каждое событие в коммитах.

2 голосов
/ 16 июля 2011

EventStore сам по себе не особо заботится о том, что фиксируется, а это означает, что он сам не отслеживает отдельные типы событий для каждой фиксации.

Для этого есть несколько причин.Одним из них является простота, а другим - способность поддерживать практически любой механизм хранения.Я хотел сделать дизайн максимально простым, а модель - очень чистой.Кроме того, я хотел избежать чрезмерной нагрузки на базовый механизм хранения, который может или не поддерживать индексацию.Если вы собираетесь запрашивать определенный тип, вы уже предполагаете, что базовый механизм хранения обеспечивает индексацию.Поскольку EventStore не зависит от подсистемы хранения, эти два не смешиваются.

Другое дело, что "commit" - это на самом деле набор из одного или более событий.Когда вы загружаете коммит, вы получаете все события.

Одно из возможных решений - просто загрузить все, начиная с момента времени, а затем игнорировать события, которые вас не интересуют.Другое решение состоит в том, чтобы подписчик прослушивал все сообщения, поступающие из хранилища событий, который (асинхронно / в другом потоке) помещает сообщения в постоянное хранилище с соответствующей индексацией по типу события.Правильный ответ зависит от ваших требований к производительности.

...