Снапшоты JOliver EventStore

Скажем, у меня есть этот код:

private void CreateSnapshots(IEnumerable<StreamHead> streams)
{
    foreach (StreamHead head in streams)
    {
        IAggregate aggregate = ???;
        IMemento memento = aggregate.GetSnapshot();

        var snapshot = new Snapshot(head.StreamId, head.SnapshotRevision + 1, memento);

        eventStore.AddSnapshot(snapshot);

        observer.Notify(new SnapshotTaken(head.StreamId, head.HeadRevision));
    }
}

как узнать, какой агрегат загружать для текущего потока? Я также использую CommonDomain. Там что-то есть?

Спасибо


person Chris Martin    schedule 08.06.2011    source источник
comment
Только что заметил, что OptimisticEventStore.OpenStream(Guid streamId, int minRevision, int maxRevision) ничего не делает с заголовками фиксации. В этом ли проблема?   -  person Chris Martin    schedule 09.06.2011
comment
-› PopulateStream (int minRevision, int maxRevision, IEnumerable‹Commit› фиксирует)   -  person Chris Martin    schedule 09.06.2011


Ответы (2)


Аспект моментальных снимков EventStore требует немного любви. Я попытался сделать интерфейс IStoreEvents ориентированным на работу с отдельными агрегатами. Я также попытался убедиться, что моментальные снимки не мешают и не мешают нормальному использованию.

После выпуска версии 2.0 я обратил свое внимание на версию 2.1, и я смогу внести несколько небольших изменений в API, связанных с этим. В то же время, ваш лучший вариант, вероятно, — вообще обойти IStoreEvents при создании моментальных снимков.

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

person Jonathan Oliver    schedule 09.06.2011

Я нашел решение для себя (это определенно хак). Это все еще внеполосная съемка. Вот пример его работы.

private void CreateSnapshots(IEnumerable<StreamHead> streams)
{
    foreach (StreamHead head in streams)
    {
        //NOTE: This uses a patched version of EventStore that loads commit headers in OptimisticEventStream.PopulateStream()
        // <code>
        // this.identifiers.Add(commit.CommitId);
        // this.headers = this.headers.Union(commit.Headers).ToDictionary(k => k.Key, k => k.Value);
        // </code>
        var stream = eventStore.OpenStream(head.StreamId, int.MinValue, int.MaxValue);

        //NOTE: Nasty hack but it works.
        var aggregateType = stream.UncommittedHeaders.Where(p=>p.Key=="AggregateType").First();
        var type = aggregateTypeResolver(aggregateType.Value.ToString());

        MethodInfo methodInfo = typeof(IRepository).GetMethod("GetById");
        MethodInfo method = methodInfo.MakeGenericMethod(type);

        object o = method.Invoke(repository, new object[]{head.StreamId, head.HeadRevision});
        var aggregate = (IAggregate) o;

        IMemento memento = aggregate.GetSnapshot();

        var snapshot = new Snapshot(head.StreamId, head.HeadRevision, memento);

        eventStore.AddSnapshot(snapshot);

        observer.Notify(new SnapshotTaken(head.StreamId, head.HeadRevision));
    }
}
person Chris Martin    schedule 09.06.2011
comment
Этот последний коммит (github.com/joliver/EventStore/commit/) предоставляет лежащая в основе настойчивость напрямую. Это позволяет лучше получить доступ к самим коммитам. Кроме того, вы, вероятно, захотите делегировать создание агрегата какому-то фабричному классу вместо того, чтобы заниматься всеми этими безумными размышлениями. - person Jonathan Oliver; 10.06.2011
comment
Я попробую, но, на первый взгляд, я все еще не вижу способа найти тип агрегата для загрузки из потока. - person Chris Martin; 14.06.2011
comment
Если вы используете проект CommonDomain, тип будет сохраняться при каждой фиксации в заголовках. Поскольку у вас будет доступ к необработанному коммиту, вы можете получить доступ к заголовкам и получить тип. - person Jonathan Oliver; 16.06.2011