public static void RegisterMessageHandlers(this ContainerBuilder builder, IDictionary <string, Assembly> assemblies)
 {
     foreach (Type type in assemblies.Select(assembly => CommandHandlerRegistry.FindMessageHandlersFrom(assembly.Value)).SelectMany(types => types))
     {
         builder.RegisterType(type);
     }
 }
Exemple #2
0
        public void Can_send_event()
        {
            // arrange
            MassTransit massTransit = null;

            try
            {
                var container = new Container();
                var handler   = new TestEventHandler();
                container.Register <IEventHandler <TestEvent> >(() => handler);
                var eventRegistry   = new EventHandlerRegistry(container);
                var commandRegistry = new CommandHandlerRegistry(container);
                massTransit = new MassTransit(commandRegistry, eventRegistry, container);
                var eventBus = new EventBus(massTransit);

                // act
                eventBus.Publish(new TestEvent());

                // assert
                Thread.Sleep(TimeSpan.FromSeconds(2));
                Assert.That(handler.NumberOfTimesRan, Is.EqualTo(1));
            }
            finally
            {
                if (massTransit != null)
                {
                    massTransit.Dispose();
                }
            }
        }
        public void ReturnsNull_WhenAskingForUnregisteredCommandHandler()
        {
            var testee = new CommandHandlerRegistry();

            var handler = testee.GetCommandHandler(new ValueCommand(11));

            handler.Should().BeNull();
        }
            public void CustomMappingStrategyUsedWhenExplicitStrategyDefined()
            {
                typeLocator.Setup(mock => mock.GetTypes(It.IsAny<Func<Type, Boolean>>())).Returns(new[] { typeof(ExplicitStrategyAggregate) });

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                var handler = registry.GetHandlerFor(new FakeCommand());

                Assert.NotNull(handler);
            }
Exemple #5
0
            public void CustomMappingStrategyUsedWhenExplicitStrategyDefined()
            {
                typeLocator.Setup(mock => mock.GetTypes(It.IsAny <Func <Type, Boolean> >())).Returns(new[] { typeof(ExplicitStrategyAggregate) });

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                var handler  = registry.GetHandlerFor(new FakeCommand());

                Assert.NotNull(handler);
            }
Exemple #6
0
            public void ThrowMappingExceptionIfHandlerNotFound()
            {
                typeLocator.Setup(mock => mock.GetTypes(It.IsAny <Func <Type, Boolean> >())).Returns(new[] { typeof(AlternateImplicitStrategyAggregate) });

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                var ex       = Assert.Throws <MappingException>(() => registry.GetHandlerFor(new FakeCommand()));

                Assert.Equal(Exceptions.CommandHandlerNotFound.FormatWith(typeof(FakeCommand)), ex.Message);
            }
Exemple #7
0
            public void GetCommandHandlerBasedOnCommandType()
            {
                typeLocator.Setup(mock => mock.GetTypes(It.IsAny <Func <Type, Boolean> >())).Returns(new[] { typeof(ImplicitStrategyAggregate), typeof(AlternateImplicitStrategyAggregate) });

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                var handler  = registry.GetHandlerFor(new FakeCommand());

                Assert.Equal(typeof(ImplicitStrategyAggregate), handler.AggregateType);
            }
Exemple #8
0
            public void CanResolveRegisteredServices()
            {
                typeLocator.Setup(mock => mock.GetTypes(It.IsAny <Func <Type, Boolean> >())).Returns(new[] { typeof(ServicedAggregate) });
                serviceProvider.Setup(mock => mock.GetService(typeof(FakeService))).Returns(new FakeService());

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                var handler  = registry.GetHandlerFor(new FakeCommand());

                Assert.NotNull(handler);
            }
        public void CanGetRegisteredCommandHandler()
        {
            var testee = new CommandHandlerRegistry();

            testee.Register(typeof(ValueCommandHandler), typeof(ValueCommand));

            var handler = testee.GetCommandHandler(new ValueCommand(11));

            handler.Should().BeAssignableTo <ValueCommandHandler>();
        }
Exemple #10
0
        public void Add_Success()
        {
            //Arrange
            _commandHandlerActivatorMock.Setup(_createExpression).
            Returns(new object());
            var activator = _commandHandlerActivatorMock.Object;
            var registry  = new CommandHandlerRegistry(activator);
            var context   = new CommandHandlerContext();

            //Act
            registry.Add(context);

            //Assert
            _commandHandlerActivatorMock.Verify(_createExpression);
        }
Exemple #11
0
        public void Add_NullInput_ArgumentNullException()
        {
            //Arrange
            var activator = _commandHandlerActivatorMock.Object;
            var registry  = new CommandHandlerRegistry(activator);

            //Act
            try
            {
                registry.Add(null);

                //Assert
                Assert.True(false, "The method was supposed to throw an ArgumentNullException.");
            }
            catch (ArgumentNullException ex)
            {
                Assert.Equal("commandHandlerContext", ex.ParamName);
            }
        }
Exemple #12
0
        public void Dispose_OnlyCalledOnce()
        {
            //Arrange
            _commandHandlerActivatorMock.Setup(_createExpression).
            Returns(new object());
            _commandHandlerActivatorMock.Setup(_releaseExpression)
            .Verifiable("This method should only have been called once.");
            var activator = _commandHandlerActivatorMock.Object;
            var registry  = new CommandHandlerRegistry(activator);
            var context   = new CommandHandlerContext();

            //Act
            registry.Add(context);
            registry.Dispose();
            registry.Dispose();

            //Assert
            _commandHandlerActivatorMock.Verify(_createExpression);
            _commandHandlerActivatorMock.Verify(_releaseExpression, Times.Once());
        }
Exemple #13
0
        public static IServiceCollection AddCommandProcessor(this IServiceCollection services, Action <ICommandHandlerRegistry> action)
        {
            if (action == null)
            {
                throw new ArgumentNullException(nameof(action));
            }

            var queryHandlerRegistry = new CommandHandlerRegistry();

            action(queryHandlerRegistry);

            foreach (var registeredHandler in queryHandlerRegistry.RegisteredHandlers)
            {
                services.AddScoped(registeredHandler);
            }

            services.AddSingleton <ICommandHandlerRegistry>(queryHandlerRegistry);
            services.AddHostedService <InternalCommandProcessor>();
            return(services);
        }
Exemple #14
0
            public void RegisteredServiceOnlyResolvedOncePerHandler()
            {
                var aggregateId = GuidStrategy.NewGuid();

                typeLocator.Setup(mock => mock.GetTypes(It.IsAny <Func <Type, Boolean> >())).Returns(new[] { typeof(ServicedAggregate) });
                aggregateStore.Setup(mock => mock.Get(typeof(ServicedAggregate), aggregateId)).Returns(new ServicedAggregate());
                serviceProvider.Setup(mock => mock.GetService(typeof(FakeService))).Returns(new FakeService());

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);

                using (var context = new CommandContext(GuidStrategy.NewGuid(), HeaderCollection.Empty, new CommandEnvelope(aggregateId, new FakeCommand())))
                {
                    var handler1 = registry.GetHandlerFor(new FakeCommand());
                    handler1.Handle(context);
                    handler1.Handle(context);

                    var handler2 = registry.GetHandlerFor(new FakeCommand());
                    handler2.Handle(context);
                    handler2.Handle(context);
                }

                serviceProvider.Verify(mock => mock.GetService(typeof(FakeService)), Times.Once());
            }
            public void ThrowMappingExceptionIfHandlerNotFound()
            {
                typeLocator.Setup(mock => mock.GetTypes(It.IsAny<Func<Type, Boolean>>())).Returns(new[] { typeof(AlternateImplicitStrategyAggregate) });

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                var ex = Assert.Throws<MappingException>(() => registry.GetHandlerFor(new FakeCommand()));

                Assert.Equal(Exceptions.CommandHandlerNotFound.FormatWith(typeof(FakeCommand)), ex.Message);
            }
            public void RegisteredServiceOnlyResolvedOncePerHandler()
            {
                var aggregateId = GuidStrategy.NewGuid();

                typeLocator.Setup(mock => mock.GetTypes(It.IsAny<Func<Type, Boolean>>())).Returns(new[] { typeof(ServicedAggregate) });
                aggregateStore.Setup(mock => mock.Get(typeof(ServicedAggregate), aggregateId)).Returns(new ServicedAggregate());
                serviceProvider.Setup(mock => mock.GetService(typeof(FakeService))).Returns(new FakeService());

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                using (var context = new CommandContext(GuidStrategy.NewGuid(), HeaderCollection.Empty, new CommandEnvelope(aggregateId, new FakeCommand())))
                {
                    var handler1 = registry.GetHandlerFor(new FakeCommand());
                    handler1.Handle(context);
                    handler1.Handle(context);

                    var handler2 = registry.GetHandlerFor(new FakeCommand());
                    handler2.Handle(context);
                    handler2.Handle(context);
                }

                serviceProvider.Verify(mock => mock.GetService(typeof(FakeService)), Times.Once());
            }
            public void GetCommandHandlerBasedOnCommandType()
            {
                typeLocator.Setup(mock => mock.GetTypes(It.IsAny<Func<Type, Boolean>>())).Returns(new[] { typeof(ImplicitStrategyAggregate), typeof(AlternateImplicitStrategyAggregate) });

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                var handler = registry.GetHandlerFor(new FakeCommand());

                Assert.Equal(typeof(ImplicitStrategyAggregate), handler.AggregateType);
            }
Exemple #18
0
 public CommandHandlerRegistryUnitTests()
 {
     _commandHandlerList = new ICommandHandler[] { new CommandACommandHandler(),
                                                   new CommandACommandHandler2(), new CommandBCommandHandler() };
     _target = new CommandHandlerRegistry(_commandHandlerList);
 }
            public void CanResolveRegisteredServices()
            {
                typeLocator.Setup(mock => mock.GetTypes(It.IsAny<Func<Type, Boolean>>())).Returns(new[] { typeof(ServicedAggregate) });
                serviceProvider.Setup(mock => mock.GetService(typeof(FakeService))).Returns(new FakeService());

                var registry = new CommandHandlerRegistry(aggregateStore.Object, typeLocator.Object, serviceProvider.Object);
                var handler = registry.GetHandlerFor(new FakeCommand());

                Assert.NotNull(handler);
            }
Exemple #20
0
        private void InitializeCommandHandlers()
        {
            handlerRegistry = new CommandHandlerRegistry();

            handlerRegistry.RegisterHandler(new CustomerCommandHandler(GetCustomerRepository));
        }