2011-06-08 39 views
2

說我有這樣的代碼: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。那裏有東西嗎?

謝謝

+0

只注意到OptimisticEventStore.OpenStream(Guid streamId,int minRevision,int maxRevision)不會對提交標頭做任何事情。問題在哪裏? – 2011-06-08 20:53:29

+0

- > PopulateStream(int minRevision,int maxRevision,IEnumerable 提交) – 2011-06-08 20:54:11

回答

3

EventStore的快照方面需要一點愛。我試圖讓IStoreEvents接口適合與單個聚合進行工作。我也試圖確保快照不會干擾或阻礙正常使用。

自從v2.0發佈以來,我已經將注意力轉向v2.1,並且我將能夠做出與此相關的一些小的API更改。與此同時,你最好的選擇是在做快照時完全繞過IStoreEvents。

另一種替代方法是讓快照代碼與常規代碼一起在進程中運行。當加載聚合需要一個快照時,您可以輕鬆地將對該聚合的引用異步地推送到快照代碼。這樣,您實際上不必執行加載,因爲您已經擁有聚合。

1

我找到了一個解決方案對我來說(這絕對是一個黑客)。它仍然是帶外快照。這是它的一個sample它的行動。

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)); 
    } 
} 
+0

這個最新的提交(https://github.com/joliver/EventStore/commit/15afa02d8e2c034d2d592ace8e7309adfdc30bc2)直接暴露了基礎持久性。這允許更好地訪問實際的提交本身。此外,您可能想要將聚合的構建委託給某種工廠類,而不是進行所有這些瘋狂的反思。 – 2011-06-10 12:00:16

+0

我會給它一個鏡頭,但乍看之下,我仍然沒有看到一種方法來查找要從流中加載的*類型*的聚合。 – 2011-06-13 21:35:13

+0

如果您使用的是CommonDomain項目,則類型將存儲在標題中的每個提交中。因爲您可以訪問原始提交,所以您可以訪問標題並獲取類型。 – 2011-06-15 20:36:37

相關問題