예제 #1
0
        public void WhenThereAreMultipleHandlersForACommandTheyAreAllReturned()
        {
            var handlers = _target.Filter(typeof(CommandA));

            Assert.Collection(handlers,
                              e => Assert.IsType <CommandACommandHandler>(e),
                              e => Assert.IsType <CommandACommandHandler2>(e));
        }
예제 #2
0
        public void WhenIExecuteACommandItIsDispatchedToItsHandler()
        {
            var commandHandler           = Substitute.For <ICommandHandler <TestCommand> >();
            var actualCommandHandlerList = new ICommandHandler[] { commandHandler };
            var expectedEvents           = new List <IEvent> {
                Substitute.For <IEvent>(), Substitute.For <IEvent>()
            };
            var expectedContextId = Guid.NewGuid();

            _commandHandlerRegistry.Filter(typeof(TestCommand)).Returns(actualCommandHandlerList);

            var command = new TestCommand();

            commandHandler.Execute(expectedContextId, command).Returns(expectedEvents);

            _target.Dispatch(expectedContextId, command);

            _repository.Received().Add(Arg.Is <IEnumerable <IEvent> >(e => ValidateEventList(expectedEvents, e.ToArray())));
        }
        public void Dispatch <TCommand>(Guid contextId, TCommand command)
            where TCommand : ICommand
        {
            var events   = new List <IEvent>();
            var handlers = _commandHandlerRegistry.Filter(command.GetType());

            if (!handlers.Any())
            {
                throw new EventEngineMissingCommandHandlerException(command);
            }

            foreach (var handler in handlers)
            {
                var executionMethodInfo = handler.GetType().GetMethod(nameof(ICommandHandler <ICommand> .Execute));
                events.AddRange((IEnumerable <IEvent>)executionMethodInfo.Invoke(handler, new object[] { contextId, command }));
            }
            _eventStore.Add(events);
        }