2

このコードがあるとします:

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 も使用しています。そこに何かありますか?

ありがとう

4

2 に答える 2

3

EventStore のスナップショットの側面には、多少の愛情が必要です。私は、IStoreEvents インターフェイスを個々の集計の操作に合わせて作成しようとしました。また、スナップショットが干渉したり、通常の使用を妨げたりしないように努めました。

v2.0 のリリース以来、私は v2.1 に注目しており、これに関連するいくつかの小さな API 変更を行うことができます。当面は、スナップショットを作成するときに IStoreEvents を完全にバイパスすることをお勧めします。

もう 1 つの方法は、スナップショット コードを通常のコードと一緒にインプロセスで実行することです。スナップショットが必要な集計が読み込まれると、その集計への参照をスナップショット作成コードに非同期で簡単にプッシュできます。この方法では、既に集計があるため、実際にロードを行う必要はありません。

于 2011-06-09T14:12:48.993 に答える
1

私は解決策を見つけました(これは間違いなくハックです)。まだアウトオブバンドのスナップショットです。これが実際の動作のサンプルです。

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));
    }
}
于 2011-06-09T18:52:12.130 に答える