public ICommandResult <ShoppingCart, IDomainEvent> Execute(AddItemToShoppingCart command) { var context = CommandExecutionContext.Create(this, ApplyEventRouter); var isNew = Id == null; if (isNew) { var shoppingCartCreated = new ShoppingCartCreated(command.Id); context = context.ApplyEvent(shoppingCartCreated); } var itemAddedToShoppingCart = new ItemAddedToShoppingCart(command.Id, command.Item); context = context.ApplyEvent(itemAddedToShoppingCart); return(context.Result); }
public ShoppingCartCommandResult Handle(AddItemToShoppingCart command) { var result = new ShoppingCartCommandResult(this).WithEventRouter(EventRouter); var isNew = Id == null; if (isNew) { var shoppingCartCreated = new ShoppingCartCreated(command.Id); result = result.ApplyEvent(shoppingCartCreated); } var itemAddedToShoppingCart = new ItemAddedToShoppingCart(command.Id, command.Item); result = result.ApplyEvent(itemAddedToShoppingCart); return(result); }
public void RoundTripTest() { var shoppingCartId = Guid.NewGuid(); // This could come from a sequence, or could be the customer's ID. // Execute the first command. var initialState = new ShoppingCart(); var command1 = new AddItemToShoppingCart(shoppingCartId, "First Item"); var result1 = initialState.Handle(command1); // Check the updated aggregate root state. Assert.That(result1.AggregateRoot.Id, Is.EqualTo(shoppingCartId)); Assert.That(result1.AggregateRoot.Items, Has.Count.EqualTo(1)); Assert.That(result1.AggregateRoot.Items[0], Is.EqualTo("First Item")); // We expect that two events were be applied. Assert.That(result1.AppliedEvents, Has.Count.EqualTo(2)); Assert.That(result1.AppliedEvents[0], Is.TypeOf <ShoppingCartCreated>()); Assert.That(result1.AppliedEvents[1], Is.TypeOf <ItemAddedToShoppingCart>()); // Execute the second command to the result of the first command. var command2 = new AddItemToShoppingCart(shoppingCartId, "Second Item"); var result2 = result1.AggregateRoot.Handle(command2); // Check the updated aggregate root state. Assert.That(result2.AggregateRoot.Id, Is.EqualTo(shoppingCartId)); Assert.That(result2.AggregateRoot.Items, Has.Count.EqualTo(2)); Assert.That(result2.AggregateRoot.Items[0], Is.EqualTo("First Item")); Assert.That(result2.AggregateRoot.Items[1], Is.EqualTo("Second Item")); // We expect that one event was applied. Assert.That(result2.AppliedEvents, Has.Count.EqualTo(1)); Assert.That(result2.AppliedEvents[0], Is.TypeOf <ItemAddedToShoppingCart>()); // The aggregate event log is the sum total of all events from both commands. // Simulate loading from the event log. var eventLog = result1.AppliedEvents.Concat(result2.AppliedEvents); var loadedAggregate = ShoppingCart.EventRouter.Apply(new ShoppingCart(), eventLog); // Check the loaded aggregate root state. Assert.That(loadedAggregate.Id, Is.EqualTo(shoppingCartId)); Assert.That(loadedAggregate.Items, Has.Count.EqualTo(2)); Assert.That(loadedAggregate.Items[0], Is.EqualTo("First Item")); Assert.That(loadedAggregate.Items[1], Is.EqualTo("Second Item")); }
public async Task PersistedRoundTripTest() { var shoppingCartId = Guid.NewGuid(); // This could come from a sequence, or could be the customer's ID. // Execute the first command. var initialState = new ShoppingCart(); var command1 = new AddItemToShoppingCart(shoppingCartId, "First Item"); var result1 = initialState.Execute(command1); // Execute the second command to the result of the first command. var command2 = new AddItemToShoppingCart(shoppingCartId, "Second Item"); var result2 = result1.NewState.Execute(command2); Assert.That(result2.NewState.Id.HasValue, "Expected ShoppingCart ID to be set"); var eventsToPersist = result1.AppliedEvents.Concat(result2.AppliedEvents).ToList(); var serializer = CreateJsonSerializer(initialState.EventNameMap); var repository = new EventStoreEventsRepository(EventStoreConnection, serializer); var streamName = $"shoppingCart-{result2.NewState.Id.Value}"; var nextEventVersion = await repository.SaveEventsAsync(streamName, ExpectedVersion.NoStream, eventsToPersist); var expectedNextEventVersion = eventsToPersist.Count - 1; Assert.That(nextEventVersion, Is.EqualTo(expectedNextEventVersion)); var eventsFromPersistence = (await repository.LoadEventsAsync <IDomainEvent>(streamName)); var loadedAggregate = ShoppingCart.FromEvents(eventsFromPersistence); // Check the loaded aggregate root state. Assert.That(loadedAggregate.Id, Is.EqualTo(shoppingCartId)); Assert.That(loadedAggregate.Items, Has.Count.EqualTo(2)); Assert.That(loadedAggregate.Items[0], Is.EqualTo("First Item")); Assert.That(loadedAggregate.Items[1], Is.EqualTo("Second Item")); }