Пример #1
0
        public void Publish <T>(T[] events, string trackingId = null) where T : DomainEvent
        {
            if (!events.Any())
            {
                return;
            }
            ;
            _logger.InfoFormat("Publishing {0} events", events.Count());
            var commands = new ICommand[events.Length];

            for (var eventCount = 0; eventCount < events.Length; eventCount++)
            {
                var messagingCommand = DomainMessageTranslator.TranslateCommand(events[eventCount],
                                                                                new CommandType(events[eventCount].GetType().Name));
                _logger.DebugFormat("Translated {0} ", events[eventCount].GetType().Name);
                messagingCommand.TrackingId = trackingId;
                var json = JsonConvert.SerializeObject(events[eventCount], Formatting.Indented, new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.All
                });
                _logger.InfoFormat("{0} Id:{1}, Tracking: {2}", events[eventCount].GetType().Name, events[eventCount].Id, trackingId);
                _logger.Debug(json);
                _resultPublisher.Publish(new DomainResult(events[eventCount], ResultCode.Unknown));
                commands[eventCount] = messagingCommand;
            }
            _commandQueue.QueueCommand(commands);
        }
Пример #2
0
        public void CommandsWithSameIdAreQueued()
        {
            var concurrentCommands = 100;
            var commands           = new List <TrackedCommand>();

            for (var count = 0; count < concurrentCommands; count++)
            {
                commands.Add(DomainMessageTranslator.TranslateCommand(new TestDomainCommand(),
                                                                      new CommandType("TestDomainCommand")));
            }
            Parallel.For(0, concurrentCommands, count =>
            {
                _eventHandler.Dispatch(commands[count]);
            });
            Thread.Sleep(100);
            Assert.AreEqual(concurrentCommands, _handleCommandInstance.Handled.Count);
            Assert.AreEqual("TestDomainCommand", _handleCommandInstance.Handled.First());
            var times = _handleCommandInstance.Times.OrderBy(x => x.Item1.Ticks).ToArray();

            for (var count = 0; count < concurrentCommands - 1; count++)
            {
                Assert.IsTrue(times[count].Item1.Ticks < times[count].Item2.Ticks);
                Assert.IsTrue(times[count + 1].Item1.Ticks < times[count + 1].Item2.Ticks);
                Assert.IsTrue(times[count].Item2.Ticks <= times[count + 1].Item1.Ticks);
            }
        }
Пример #3
0
        public void CommandHandlerIsCalled()
        {
            var testCommand = DomainMessageTranslator.TranslateCommand(new TestDomainCommand(), new CommandType("TestDomainCommand"));

            Assert.IsTrue(_eventHandler.Dispatch(testCommand));
            Assert.AreEqual(1, _handleCommandInstance.Handled.Count);
            Assert.AreEqual("TestDomainCommand", _handleCommandInstance.Handled.First());
        }
Пример #4
0
        public void EventHandlerIsCalled()
        {
            var testEvent = DomainMessageTranslator.TranslateCommand(new TestDomainEvent(Guid.NewGuid()), new CommandType("TestDomainEvent"));

            Assert.IsTrue(_eventHandler.Dispatch(testEvent));
            Assert.AreEqual(1, _eventInstance.Handled.Count);
            Assert.AreEqual("TestDomainEvent", _eventInstance.Handled.First());
        }
Пример #5
0
        private TrackedCommand SendCommand <T>(T command) where T : IDomainCommand
        {
            var messagingCommand = DomainMessageTranslator.TranslateCommand(command, new CommandType(command.GetType().Name));

            _resultPublisher.Publish(new DomainResult(command, ResultCode.Unknown));
            _logger.InfoFormat("Queuing {0}", command.GetType());
            _commandQueue.QueueCommand(messagingCommand);
            return(messagingCommand);
        }
Пример #6
0
        public void ProperlyHandleCommandThrowingException()
        {
            DomainResult result = null;

            _resultPublisherMock.Setup(x => x.Publish(It.IsAny <DomainResult>())).Callback <DomainResult>(r => result = r);
            var testCommand = DomainMessageTranslator.TranslateCommand(new TestDomainEvent4(Guid.NewGuid()),
                                                                       new CommandType("TestDomainEvent4"));

            Assert.IsTrue(_eventHandler.Dispatch(testCommand));
            Assert.IsFalse(_handleCommandInstance.Handled.Any());
            Assert.AreEqual(ResultCode.Failed, result.ResultCode);
        }
Пример #7
0
        public bool Dispatch(ICommand message)
        {
            _logger.InfoFormat("Dispatching message {0}", message.Type.Value);
            InitCache();
            HandlerStore handlerStore;

            _handlersCache.TryGetValue(message.Type.Value, out handlerStore);
            if (handlerStore != null)
            {
                var cqrsMessage = DomainMessageTranslator.TranslateCommand(message, handlerStore.CqrsMessageType);
                if (cqrsMessage is IDomainCommand)
                {
                    _logger.DebugFormat("Handling command");
                    HandleCommand(handlerStore, cqrsMessage as IDomainCommand);
                }
                else
                {
                    _logger.DebugFormat("Handling event");
                    HandleMessage(handlerStore, cqrsMessage);
                }
            }
            else
            {
                var cqrsMessage = DomainMessageTranslator.TranslateCommand(message, typeof(GenericDomainMessage));

                _logger.DebugFormat("No known handler for {0}, returning", message.Type.Value);
                var cqrsResult = new DomainResult
                {
                    Id         = message.Id,
                    TrackingId = cqrsMessage.TrackingId,
                    ResultCode = ResultCode.OK
                };
                _resultPublisher.Publish(cqrsResult);
            }
            return(true);
        }