Example #1
0
        public void Handle(TakeMarchandise command)
        {
            var stream       = _eventStoreInMemory.GetAll(command.Id);
            var domainEvents = Order.Decide(command, stream);

            foreach (var domainEvent in domainEvents)
            {
                _eventPublisher.Publish(domainEvent, stream.Count);
            }
        }
Example #2
0
        public static IEnumerable <IDomainEvent> Decide(IDomainCommand command, IEnumerable <IDomainEvent> pastEvents)
        {
            var decisionProjection = new DecisionProjection();

            foreach (var domainEvent in pastEvents)
            {
                decisionProjection.Apply(domainEvent);
            }

            var uncommittedEvents = command switch
            {
                StartOrder startOrder => Decide(startOrder, decisionProjection),
                TakeMarchandise takeMarchandise => Decide(takeMarchandise, decisionProjection),
                _ => new List <IDomainEvent>()
            };

            return(uncommittedEvents);
        }
Example #3
0
        private static IEnumerable <IDomainEvent> Decide(TakeMarchandise takeMarchandise,
                                                         DecisionProjection decisionProjection)
        {
            if (decisionProjection.IsMarchandiseReceived)
            {
                return(new List <IDomainEvent>());
            }

            if (!decisionProjection.IsStarted)
            {
                return(new List <IDomainEvent>());
            }

            if (decisionProjection.NumberColisRemaining > takeMarchandise.ColisList.Count)
            {
                var numberColisRemaining = decisionProjection.NumberColisRemaining - takeMarchandise.ColisList.Count;
                return(new List <IDomainEvent>
                {
                    new MarchandisePartiallyReceived(takeMarchandise.Id, numberColisRemaining)
                });
            }

            if (decisionProjection.NumberColisRemaining < takeMarchandise.ColisList.Count)
            {
                var numberColisExcess = takeMarchandise.ColisList.Count - decisionProjection.NumberColisRemaining;
                return(new List <IDomainEvent>
                {
                    new MarchandiseReceived(takeMarchandise.Id, decisionProjection.NumberColisRemaining),
                    new MarchandiseExcessReceived(takeMarchandise.Id, numberColisExcess)
                });
            }

            return(new List <IDomainEvent> {
                new MarchandiseReceived(takeMarchandise.Id, 0)
            });
        }