使用Ncqrs,是否有重放每一個發生的事件(所有聚合類型)的方法,並通過我的denormalizers提供這些以便從頭重新創建整個讀取模型?Ncqrs重新創建完整的ReadModel
編輯:
我雖然它是很好的提供更具體的使用情況。我在ASP.NET MVC應用程序中構建它,並使用實體框架(代碼優先)來處理讀取的模型。爲了加速開發(並且因爲我很懶),我想使用一個數據庫初始化程序,在任何讀取模型更改後重新創建數據庫模式。然後使用初始化器的種子方法重新填充它們。
使用Ncqrs,是否有重放每一個發生的事件(所有聚合類型)的方法,並通過我的denormalizers提供這些以便從頭重新創建整個讀取模型?Ncqrs重新創建完整的ReadModel
編輯:
我雖然它是很好的提供更具體的使用情況。我在ASP.NET MVC應用程序中構建它,並使用實體框架(代碼優先)來處理讀取的模型。爲了加速開發(並且因爲我很懶),我想使用一個數據庫初始化程序,在任何讀取模型更改後重新創建數據庫模式。然後使用初始化器的種子方法重新填充它們。
我最終做的是以下內容。在服務啓動時,在處理任何命令之前,如果讀取模型已更改,則將其丟棄並通過處理我的denormalizers中的所有過去事件從頭開始重新創建它。這是在數據庫初始化程序的種子方法中完成的。
這是一個使用MS SQL事件存儲的簡單任務,因爲有一種檢索所有事件的方法。但是,我不確定其他事件存儲。
不幸的是,沒有內置任何內置功能來爲您做這件事(儘管我還沒有更新我在相當一段時間使用的ncqrs版本,所以可能會改變)。做它也有點不平凡,因爲它取決於你想要做什麼。
我會做(到現在爲止我還沒有必要)的方法是:
根據你在做什麼可能是所有事件,或者只是一個聚合根的事件,或者一個或多個聚合根的事件子集。
重新從頭開始創建在內存中讀取模式(保存緩慢和不必要的寫入)
Store中重新創建替代現有
的讀取模式打電話到事件存儲更多的時間來獲得可能已經錯過
重複,直至有返回沒有新的事件的任何事件
有一點需要注意,如果您是從頭開始重新創建整個讀取模型數據庫,我會暫時離線服務或排隊新事件,直到完成。
再次有不同的方法可以解決這個問題,你的架構和場景可能會決定如何做到最好。
我們使用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)
感謝您的輸入。是的,如你所說,這一切都取決於情況。我已經更新了我的問題,並提供了我最終如何做的描述。 –