public static Func <ICommand, Task> Run(CancellationToken token, Subject <IEvent> eventSubject, Action <string> logger) { const string streamName = "hamsters"; var commitLog = new MessageVaultClientAdapter(new MemoryClient(), logger); var dispatcher = new Dispatcher <ICommand, Task>(); var eventHandlers = new Dispatcher <IEvent, Task>(); var checkpointWriter = new CheckpointWriterAdapter(new MemoryCheckpointReaderWriter()); var repository = new InMemoryStateRepository <HamsterState>(); var streamProcessor = new StreamProcessor(commitLog, streamName, checkpointWriter, Serialization.Deserializer(), Console.WriteLine); var eventLog = commitLog.ToStreamPoster(Serialization.Serializer()); dispatcher.Register <IHamsterCommand>( command => ApplicationService.Execute( command, id => repository.GetOrCreateAsync(id), state => new HamsterAggregate(state), aggregate => aggregate.Handle(command), eventLog.ForStream(streamName))); eventHandlers.Register <IEvent>(@event => StateEventHandler.ForAsync(@event, repository)); eventSubject.Subscribe(@event => eventHandlers.Dispatch(@event).Wait(token), () => { }, token); streamProcessor.Run(token, @event => eventSubject.OnNext(@event)); return(dispatcher.Dispatch); return(Mixins.WaitForEventsPublished(dispatcher.Dispatch, eventSubject, logger)); }