예제 #1
0
        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));
        }