Skip to content

Instantly share code, notes, and snippets.

@ToJans
Created May 5, 2011 08:49
Show Gist options
  • Save ToJans/956750 to your computer and use it in GitHub Desktop.
Save ToJans/956750 to your computer and use it in GitHub Desktop.
Simple concept code to show how CQRS works
//---><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