-
-
Save abombss/1007606 to your computer and use it in GitHub Desktop.
Simple concept code to show how CQRS works
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//---><8--------------------------- UI loads viewmodels and generates commands ---- | |
UI.Viewmodel = ViewModelStore.Query(UI.SomeParameters); | |
UI.HandleInput = GeneratedCommand => CommandStore.Add(GeneratedCommand); | |
//---><8--------------------------- Commands to events ----------------------------------------- | |
// This uses an iterator because a command should only be handled once | |
while(CommandStore.HasCommands) | |
{ | |
var cmd = CommandStore.Next(); | |
var cmdhandler = CommandHandlers.GetHandlerForCommand(cmd); | |
cmdhandler.DecorateCommand(cmd); | |
var AR = ARStore.CreateOrLoad(cmdhandler.GetARInfo(cmd)); | |
cmdhandler.HandleCommand(AR,cmd); | |
EventStore.AddRange(AR.NewEvents); | |
} | |
//---><8--------------------------- Events to viewmodel/AR updates or commands---------- | |
// this uses a pointer instead of an iterator since events can be handled multiple times | |
while(EventStore.HasNewEvents(ref someeventpointer)) | |
{ | |
var evt = EventStore.Next(ref someeventpointer); | |
foreach (var eventhandler in ARHandlers.GetHandlersForEvent(evt)) | |
{ | |
var AR = ARStore.CreateOrLoad(eventhandler.GetARInfo(evt)); | |
eventhandler.ProcessEvent(AR,evt); | |
if (AR.HasChanges) | |
ARStore.SaveChanges(AR); | |
} | |
foreach (var eventhandler in SagaHandlers.GetHandlersForEvent(evt)) | |
{ | |
var saga = SagaStore.CreateOrLoad(eventhandler.GetSagaInfo(evt))); | |
var cmd = eventhandler.ProcessEvent(saga,evt); | |
if (cmd!=null) | |
CommandStore.Add(cmd); | |
if (saga.IsEOL) | |
SagaStore.Purge(saga); | |
else if (saga.HasChanges) | |
SagaStore.SaveChanges(saga); | |
} | |
foreach (var eventhandler in ViewModelHandlers.GetHandlersForEvent(evt)) | |
{ | |
var viewmodel = ViewModelStore.CreateOrLoad(eventhandler.GetViewModelInfo(evt)); | |
eventhandler.ProcessEvent(viewmodel,evt); | |
if (viewmodel.HasChanges) | |
ViewModelStore.SaveChanges(viewmodel); | |
} | |
} | |
//---><8--------------------------- Time triggers for sagas ---------- | |
while (SagaStore.HasOverDueSagas()) | |
{ | |
var saga = SagaStore.NextOverdueSaga(); | |
var overduehandler = SagaHandlers.GetHandlerForOverdue(saga); | |
var cmd = overduehandler.ProcessOverdue(saga); | |
if (cmd!=null) | |
CommandStore.Add(cmd); | |
if (saga.IsEOL) | |
SagaStore.Purge(saga); | |
else if (saga.HasChanges) | |
SagaStore.SaveChanges(saga); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment