Example #1
0
 private static IEnumerable <IDomainEvent> Decide(StartOrder startOrder, DecisionProjection decisionProjection)
 {
     return(decisionProjection.IsStarted
         ? new List <IDomainEvent>()
         : new List <IDomainEvent> {
         new OrderStarted(startOrder.Id, startOrder.ColisList.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)
            });
        }