2011-09-13 28 views
1

使用Ncqrs,是否有重放每一個發生的事件(所有聚合類型)的方法,並通過我的denormalizers提供這些以便從頭重新創建整個讀取模型?Ncqrs重新創建完整的ReadModel

編輯:

我雖然它是很好的提供更具體的使用情況。我在ASP.NET MVC應用程序中構建它,並使用實體框架(代碼優先)來處理讀取的模型。爲了加速開發(並且因爲我很懶),我想使用一個數據庫初始化程序,在任何讀取模型更改後重新創建數據庫模式。然後使用初始化器的種子方法重新填充它們。

回答

1

我最終做的是以下內容。在服務啓動時,在處理任何命令之前,如果讀取模型已更改,則將其丟棄並通過處理我的denormalizers中的所有過去事件從頭開始重新創建它。這是在數據庫初始化程序的種子方法中完成的。

這是一個使用MS SQL事件存儲的簡單任務,因爲有一種檢索所有事件的方法。但是,我不確定其他事件存儲。

2

不幸的是,沒有內置任何內置功能來爲您做這件事(儘管我還沒有更新我在相當一段時間使用的ncqrs版本,所以可能會改變)。做它也有點不平凡,因爲它取決於你想要做什麼。

我會做(到現在爲止我還沒有必要)的方法是:

  • 呼叫轉移到事件存儲來獲取所有相關事件

根據你在做什麼可能是所有事件,或者只是一個聚合根的事件,或者一個或多個聚合根的事件子集。

  • 重新從頭開始創建在內存中讀取模式(保存緩慢和不必要的寫入)

  • Store中重新創建替代現有

  • 的讀取模式打電話到事件存儲更多的時間來獲得可能已經錯過

  • 重複,直至有返回沒有新的事件的任何事件

有一點需要注意,如果您是從頭開始重新創建整個讀取模型數據庫,我會暫時離線服務或排隊新事件,直到完成。

再次有不同的方法可以解決這個問題,你的架構和場景可能會決定如何做到最好。

+0

感謝您的輸入。是的,如你所說,這一切都取決於情況。我已經更新了我的問題,並提供了我最終如何做的描述。 –

2

我們使用MsSqlServerEventStore,重播所有我實現下面的代碼的事件:

var myEventBus = NcqrsEnvironment.Get<IEventBus>(); 
if (myEventBus == null) throw new Exception("EventBus is not found in NcqesEnvironment"); 
var myEventStore = NcqrsEnvironment.Get<IEventStore>() as MsSqlServerEventStore; 
if (myEventStore == null) throw new Exception("MsSqlServerEventStore is not found in NcqesEnvironment"); 
var myEvents = myEventStore.GetEventsAfter(GetFirstEventIdFromEventStore(), int.MaxValue); 
myEventBus.Publish(myEvents); 

這將推動對eventbus所有事件和denormalizers將處理所有的事件。函數GetFirstEventIdFromEventStore只查詢事件庫並從事件庫返回第一個Id(其中SequentialId = 1)