コード例 #1
0
        public async Task When_an_exception_is_thrown_during_a_read_model_update_then_it_is_logged_on_its_bus()
        {
            var projector = new Projector <Order.ItemAdded>(() => new ReadModelDbContext())
            {
                OnUpdate = (work, e) => { throw new Exception("oops!"); }
            };

            var itemAdded = new Order.ItemAdded
            {
                AggregateId    = Any.Guid(),
                SequenceNumber = 1,
                ProductName    = Any.AlphanumericString(10, 20),
                Price          = Any.Decimal(0.01m),
                Quantity       = 100
            };

            var errors = new List <Domain.EventHandlingError>();

            using (var catchup = CreateReadModelCatchup(projector))
                using (var db = new EventStoreDbContext())
                {
                    db.Events.Add(itemAdded.ToStorableEvent());
                    db.SaveChanges();
                    catchup.EventBus.Errors.Subscribe(errors.Add);
                    await catchup.Run();
                }

            var error = errors.Single(e => e.AggregateId == itemAdded.AggregateId);

            error.SequenceNumber.Should().Be(itemAdded.SequenceNumber);
            error.Event
            .ShouldHave()
            .Properties(p => p.SequenceNumber)
            .EqualTo(itemAdded);
        }
コード例 #2
0
        public void When_Metadata_Actor_is_not_set_then_Event_Actor_will_be_null()
        {
            var sourceEvent = new Order.ItemAdded();

            var storableEvent = sourceEvent.ToStorableEvent();

            storableEvent.Actor.Should().BeNull();
        }
コード例 #3
0
        public async Task When_classes_not_implementing_IEvent_are_used_to_query_the_event_store_then_only_the_corresponding_events_are_queried()
        {
            var eventsQueried         = 0;
            var expectedEventsQueried = 0;

            Events.Write(20, _ =>
            {
                Event e = null;
                switch (Any.Int(1, 3))
                {
                case 1:
                    e = (Event)Events.Any();
                    break;

                case 2:
                    e = new Order.ItemAdded();
                    break;

                case 3:
                    e = new Order.ItemRemoved();
                    break;
                }

                if (e is Order.ItemAdded || e is Order.ItemRemoved)
                {
                    expectedEventsQueried++;
                }

                e.AggregateId = Guid.NewGuid();

                return(e);
            });

            var projector1 = Projector.CreateFor <ItemAdded>(e =>
            {
                eventsQueried++;
            });
            var projector2 = Projector.CreateFor <ItemRemoved>(e =>
            {
                eventsQueried++;
            });

            using (var catchup = CreateReadModelCatchup(projector1, projector2))
            {
                await catchup.Run();
            }

            eventsQueried.Should().Be(expectedEventsQueried);
        }
コード例 #4
0
        public void Event_Actor_is_populated_from_Event_Metadata()
        {
            var actor = Any.Email();

            var sourceEvent = new Order.ItemAdded
            {
                Metadata =
                {
                    Actor = actor
                }
            };

            var storableEvent = sourceEvent.ToStorableEvent();

            storableEvent.Actor.Should().Be(actor);
        }
コード例 #5
0
        public async Task A_dynamic_projector_can_specify_which_events_to_query()
        {
            var eventsQueried         = 0;
            var expectedEventsQueried = 0;

            Events.Write(20, _ =>
            {
                Event e = null;
                switch (Any.Int(1, 3))
                {
                case 1:
                    e = (Event)Events.Any();
                    break;

                case 2:
                    e = new Order.ItemAdded();
                    break;

                case 3:
                    e = new Order.ItemRemoved();
                    break;
                }

                if (e is Order.ItemAdded || e is Order.ItemRemoved)
                {
                    expectedEventsQueried++;
                }

                e.AggregateId = Guid.NewGuid();

                return(e);
            });

            using (var catchup = CreateReadModelCatchup(Projector.CreateDynamic(e =>
            {
                eventsQueried++;
            },
                                                                                "Order.ItemAdded",
                                                                                "Order.ItemRemoved")))
            {
                await catchup.Run();
            }

            eventsQueried.Should().Be(expectedEventsQueried);
        }
コード例 #6
0
        private static void UpdateReservedInventory(DbContext db, Order.ItemAdded e)
        {
            var inventoryRecord = db.Set <ProductInventory>()
                                  .SingleOrDefault(r => r.ProductName == e.ProductName)
                                  .IfNotNull()
                                  .Then(r => r)
                                  .Else(() =>
            {
                var r = new ProductInventory
                {
                    ProductName = e.ProductName
                };
                db.Set <ProductInventory>().Add(r);
                return(r);
            });

            inventoryRecord.QuantityReserved += e.Quantity;

            db.SaveChanges();
        }
コード例 #7
0
 public void UpdateProjection(Order.ItemAdded @event)
 {
 }