예제 #1
0
        static ShoppingCart()
        {
            var routes = new ApplyEventRouterBuilder <ShoppingCart, IDomainEvent>();

            routes.Add <ShoppingCartCreated>((agg, e) => agg.Apply(e));
            routes.Add <ItemAddedToShoppingCart>((agg, e) => agg.Apply(e));

            ApplyEventRouter = routes.Build();
        }
예제 #2
0
        public void EventNamesAreMappedWhenEventRoutesAreAdded()
        {
            var builder = new ApplyEventRouterBuilder <MyAggregateRoot, IEvent>();

            builder.Add <SomethingHappened>((agg, e) => agg.ApplyEvent(e));
            builder.Add <SomethingElseHappened>((agg, e) => agg.ApplyEvent(e));

            var router = builder.Build();

            Assert.That(router.EventNameMap.GetEventNameForClrType(typeof(SomethingHappened)),
                        Is.EqualTo(EventNames.SomethingHappened));

            Assert.That(router.EventNameMap.GetEventNameForClrType(typeof(SomethingElseHappened)),
                        Is.EqualTo(EventNames.SomethingElseHappened));
        }
예제 #3
0
        public void MissingEventRouteThrowsException()
        {
            // Setup the event router.
            var builder = new ApplyEventRouterBuilder <MyAggregateRoot, IEvent>();

            builder.Add <SomethingHappened>((agg, e) => agg.ApplyEvent(e));
            var router = builder.Build();

            // Set up the initial state.
            var initialState = new MyAggregateRoot();

            // Create some events to apply to the aggregate.
            var event1 = new SomethingHappened("Foo");
            var event2 = new SomethingElseHappened("Bar");

            // Route the events.
            var          exception       = Assert.Throws <InvalidOperationException>(() => router.Route(initialState, event1, event2));
            const string expectedMessage = "No route or default route found when attempting to apply " +
                                           "SomethingElseHappened to MyAggregateRoot";

            Assert.That(exception.Message, Is.EqualTo(expectedMessage));
        }
예제 #4
0
        public void EventIsRoutedAndApplied()
        {
            // Setup the event router.
            var builder = new ApplyEventRouterBuilder <MyAggregateRoot, IEvent>();

            builder.Add <SomethingHappened>((agg, e) => agg.ApplyEvent(e));
            builder.Add <SomethingElseHappened>((agg, e) => agg.ApplyEvent(e));
            var router = builder.Build();

            // Set up the initial state.
            var initialState = new MyAggregateRoot();

            // Create some events to apply to the aggregate.
            var event1 = new SomethingHappened("Foo");
            var event2 = new SomethingElseHappened("Bar");

            // Route the events.
            var newState = router.Route(initialState, event1, event2);

            Assert.That(newState.State, Is.EqualTo("Foo"));
            Assert.That(newState.OtherState, Is.EqualTo("Bar"));
        }
예제 #5
0
        public void DefaultEventRouteIsInvokedWhenSpecified()
        {
            // Setup the event router.
            var builder = new ApplyEventRouterBuilder <MyAggregateRoot, IEvent>();

            builder.Add <SomethingHappened>((agg, e) => agg.ApplyEvent(e));
            builder.Add <IEvent>((agg, e) => agg.DefaultApplyEvent(e)); // Default route
            var router = builder.Build();

            // Set up the initial state.
            var initialState = new MyAggregateRoot();

            // Create some events to apply to the aggregate.
            var event1 = new SomethingHappened("Foo");
            var event2 = new SomethingElseHappened("Bar");

            // Route the events.
            var newState = router.Route(initialState, event1, event2);

            Assert.That(newState.State, Is.EqualTo("Foo"));

            // We expect SomethingElseHappened to do nothing, since the default route just returns "this".
            Assert.That(newState.OtherState, Is.Null);
        }