Beispiel #1
0
        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"));
        }