JOliver EventStore Снимок экрана - PullRequest
2 голосов
/ 09 июня 2011

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

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. Там что-то есть?

Спасибо

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

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

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

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

1 голос
/ 09 июня 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));
    }
}
...