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。

另一种选择是让快照代码与您的常规代码在进程内运行。当加载聚合需要快照时,您可以轻松地将对该聚合的引用异步推送到您的快照代码。这样,您实际上不必进行加载,因为您已经拥有聚合。

于 2011-06-09T14:12:48.993 回答
1

我为我找到了一个解决方案(这绝对是一个 hack)。它仍然是带外快照。这是它的一个示例

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 回答