コード例 #1
0
        public async Task <ICommandHandlerAggregateAnswer> Send <TCommand, TAggregate>(TCommand command)
            where TCommand : IDomainCommand
            where TAggregate : IAggregateRoot
        {
            Guard.AgainstNull <ArgumentNullException>(command);

            await commandStore.SaveCommandAsync <TAggregate>(command);

            var commandHandler = resolver.Resolve <ICommandHandlerWithResultAsync <TCommand> >();

            Guard.AgainstNull <ApplicationException>(commandHandler,
                                                     $"No handler of type ICommandHandlerWithAggregateAsync<TCommand> found for command '" +
                                                     $"{command.GetType().FullName}'");

            var commandHanderAnswer = await commandHandler.HandleAsync(command);

            if (commandHanderAnswer.ValidationResult.IsValid)
            {
                foreach (var @event in commandHanderAnswer.AggregateRoot.Events)
                {
                    @event.CommandId = command.Id;
                    var concreteEvent = eventFactory.CreateConcreteEvent(@event);
                    await eventStore.SaveEventAsync <TAggregate>((IDomainEvent)concreteEvent);

                    await eventPublisherAsync.PublishAsync(concreteEvent);
                }
            }
            return(commandHanderAnswer);
        }
コード例 #2
0
        public async Task HandleAsync(CreateTrainingCommand command, CancellationToken cancellationToken = default)
        {
            Guid.TryParse(httpContext.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value,
                          out Guid coachId);

            var coach = await repository.GetByAsync(p => p.Id == coachId, new[] { "Runners" }, cancellationToken);

            if (coach.Runners.Capacity == 0)
            {
                throw new ArgumentNullException("Coach does not have this runner!");
            }

            var runner = coach.Runners.Find(r => r.Id == command.RunnerId);

            if (runner == null)
            {
                throw new ArgumentNullException("Coach does not have this runner!");
            }

            var trainingDetails = TraningDetails.Create(command.Details, command.Comments);

            var training = Training.Create(command.TimeToDo, trainingDetails);

            coach.AddTrainigForRunner(runner, training);

            var coachName = $"{coach.FirstName} {coach.LastName}";

            await eventPublisher.PublishAsync <TrainingCreated>
                (new TrainingCreated(training.Id, DateTime.Now, coachName, runner.Email.EmailAdress));

            await repository.SaveAsync(coach);
        }
コード例 #3
0
        /// <inheritdoc />
        public async Task SendAndPublishAsync <TCommand>(TCommand command) where TCommand : ICommand
        {
            if (command == null)
            {
                throw new ArgumentNullException(nameof(command));
            }

            var handler = _handlerResolver.ResolveHandler <ICommandHandlerWithEventsAsync <TCommand> >();

            var events = await handler.HandleAsync(command);

            foreach (var @event in events)
            {
                var concreteEvent = _eventFactory.CreateConcreteEvent(@event);
                await _eventPublisherAsync.PublishAsync(concreteEvent);
            }
        }
コード例 #4
0
        public async Task SendAndPublishAsync <TCommand>(TCommand command) where TCommand : ICommand
        {
            if (command == null)
            {
                throw new ArgumentNullException(nameof(command));
            }

            var commandHandler = _resolver.Resolve <ICommandHandlerWithEventsAsync <TCommand> >();

            if (commandHandler == null)
            {
                throw new ApplicationException($"No handler of type ICommandHandlerWithEventsAsync<TCommand> found for command '{command.GetType().FullName}'");
            }

            var events = await commandHandler.HandleAsync(command);

            foreach (var @event in events)
            {
                var concreteEvent = _eventFactory.CreateConcreteEvent(@event);
                await _eventPublisher.PublishAsync(concreteEvent);
            }
        }
コード例 #5
0
 public void PublishAsync_ThrowsException_WhenEventIsNull()
 {
     _somethingCreated = null;
     Assert.ThrowsAsync <ArgumentNullException>(async() => await _sut.PublishAsync(_somethingCreated));
 }
コード例 #6
0
 public async Task PublishAsync <TEvent>(TEvent @event) where TEvent : IEvent
 {
     await _eventPublisherAsync.PublishAsync(@event);
 }
コード例 #7
0
 /// <inheritdoc />
 public Task PublishAsync <TEvent>(TEvent @event) where TEvent : IEvent
 {
     return(_eventPublisherAsync.PublishAsync(@event));
 }