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); } }
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); }
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) }); }