public void ShouldResolveSplitEventStream()
        {
            var eventStore = new EventStore();
            var events     = new IDomainEvent[]
            {
                new DraftCreatedEvent(organizationId, null),
            };
            var draftEvents = new IDomainEvent[]
            {
                new DraftCreatedEvent(draftId, organizationId),
            };
            var afterDraftEvents = new IDomainEvent[]
            {
                new LevelCreatedEvent(structureId, new LevelId(), "Level"),
            };

            foreach (var domainEvent in events)
            {
                eventStore.Add(organizationId, domainEvent);
            }
            foreach (var domainEvent in draftEvents)
            {
                eventStore.Add(draftId, domainEvent);
            }
            foreach (var domainEvent in afterDraftEvents)
            {
                eventStore.Add(organizationId, domainEvent);
            }

            eventStore.GetEvents(draftId).Should().Equal(events.Concat(draftEvents));
        }
Beispiel #2
0
    public static EventStore getDefault()
    {
        EventStore es = new EventStore();

        es.targetObjIdList.Add(0);
        es.targetObjIdList.Add(1);
        es.targetObjIdList.Add(2);

        Dictionary <int, SingleEvent> kv1 = new Dictionary <int, SingleEvent>();

        kv1.Add(0, new SingleEvent());
        kv1[0].Add("Um?");
        kv1[0].Add("What's this?");

        kv1.Add(1, new SingleEvent());
        kv1[1].Add("......");

        kv1.Add(2, new SingleEvent());
        kv1[2].Add("I can't open it ...");

        es.Add(0, kv1);

        Dictionary <int, SingleEvent> kv2 = new Dictionary <int, SingleEvent>();

        kv2.Add(0, new SingleEvent());
        kv2[0].Add("......");

        kv2.Add(1, new SingleEvent());
        kv2[1].Add("This is ... ");
        kv2[1].Add("cart ... ??");

        kv2.Add(2, new SingleEvent());
        kv2[2].Add("I can't open it ...");

        es.Add(1, kv2);

        Dictionary <int, SingleEvent> kv3 = new Dictionary <int, SingleEvent>();

        kv3.Add(0, new SingleEvent());
        kv3[0].Add("......");

        kv3.Add(1, new SingleEvent());
        kv3[1].Add("......");

        kv3.Add(2, new SingleEvent(SingleEvent.CallbackAction.Door));
        kv3[2].Add("It is open !!");

        es.Add(2, kv3);

        return(es);
    }
            public override bool TrySetMember(SetMemberBinder binder, object value)
            {
                var tValue = (DelegateAddRemove <PropertyChangedEventHandler>)value;

                string tGuid;

                if (tValue.IsAdding)
                {
                    if (!_uniqueEvents.TryGetValue(tValue.Delegate, out tGuid))
                    {
                        tGuid = Guid.NewGuid().ToString();
                        _uniqueEvents.Add(tValue.Delegate, tGuid);
                        EventStore.Add(tGuid, tValue.Delegate);
                    }
                    _parent.DependencyLink(tGuid, binder.Name);
                }
                else
                {
                    if (_uniqueEvents.TryGetValue(tValue.Delegate, out tGuid))
                    {
                        _parent.DependencyUnlink(tGuid, binder.Name);
                    }
                }
                return(true);
            }
Beispiel #4
0
        /// <summary>
        /// 订阅指定事件数据的事件处理对象
        /// </summary>
        /// <param name="eventType">事件数据类型</param>
        /// <param name="eventHandler">事件处理对象</param>
        public virtual void Subscribe(Type eventType, IEventHandler eventHandler)
        {
            eventType.CheckNotNull(nameof(eventType));
            eventHandler.CheckNotNull(nameof(eventHandler));

            EventStore.Add(eventType, eventHandler);
        }
Beispiel #5
0
        /// <summary>
        /// 订阅指定事件数据的事件处理对象
        /// </summary>
        /// <param name="eventType">事件数据类型</param>
        /// <param name="eventHandler">事件处理对象</param>
        public virtual void Subscribe(Type eventType, IEventHandler eventHandler)
        {
            Check.NotNull(eventType, nameof(eventType));
            Check.NotNull(eventHandler, nameof(eventHandler));

            EventStore.Add(eventType, eventHandler);
        }
Beispiel #6
0
 public Scenario Given(Event anEvent)
 {
     _steps.Add(
         new Step
     {
         Title = anEvent.GetType().FullName,
         Type  = "Event",
         Data  = anEvent
                 .GetType()
                 .GetProperties()
                 .ToDictionary(x => x.Name, x => x.GetValue(anEvent).ToString())
     });
     _eventStore.Add(anEvent.AggregateId(), new List <Event> {
         anEvent
     });
     return(this);
 }
Beispiel #7
0
        /// <summary>
        /// 订阅指定事件数据的事件处理对象
        /// </summary>
        /// <param name="eventType">事件数据类型</param>
        /// <param name="eventHandler">事件处理对象</param>
        public virtual void Subscribe(Type eventType, IEventHandler eventHandler)
        {
            Check.NotNull(eventType, nameof(eventType));
            Check.NotNull(eventHandler, nameof(eventHandler));

            EventStore.Add(eventType, eventHandler);
            Logger.LogDebug($"创建事件“{eventType}”到处理器“{eventHandler.GetType()}”的订阅配对");
        }
Beispiel #8
0
        public void AddingInvalidEventThrowsException()
        {
            var eventStore = new EventStore();
            var @event     = new TestEvent();

            /* Do not set aggregate id etc. */

            Assert.Throws <DomainEventIncompleteException>(() => eventStore.Add(@event));
        }
Beispiel #9
0
        public void Events_ForOrder_ShouldBeSaved()
        {
            var manager = new Manager("Manager");

            var user = new User("alex", "T", "*****@*****.**");

            var customer = new Customer(user.Id, user.Name);

            customer.Fund(100);
            var newOrderId = customer.CreateOrder();

            var order = customer.Orders.First(x => x.Id == newOrderId);

            order.SetManager(manager);
            order.AddProduct(new Product()
            {
                Price = 11,
                Type  = "Cheeseburger"
            });

            customer.PayOrder(newOrderId);

            var es = new EventStore(new DefaultEventSerializer(), new EventDataStorage());

            es.Add(customer);
            es.Commit();

            es.Add(manager);
            es.Commit();

            var orderEvents     = es.GetEventsForAggregate(order.Id);
            var orderFromEvents = new Order(order.Id);

            foreach (var @event in orderEvents)
            {
                orderFromEvents.Handle(@event);
            }

            Assert.Equal(11, orderFromEvents.Products.First().Price);
            Assert.True(orderFromEvents.IsClosed);
            Assert.True(orderFromEvents.IsPayed);
        }
        public void ReconstitutedNewAccountHasCorrectName()
        {
            var accountId  = new Guid("A34C7724-F9FE-4A14-89A2-C8F1D662EE2A");
            var eventStore = new EventStore();
            var prevouslyCreatedAccount = new Account(accountId, "Test2");

            eventStore.Add(prevouslyCreatedAccount.Events);

            var account = new Account(accountId, eventStore.GetEvents());

            Assert.AreEqual("Test2", account.Name);
        }
Beispiel #11
0
        public void AddedEventsAreInStore()
        {
            var eventStore = new EventStore();
            var @event     = new TestEvent();

            @event.AggregateId = new TestEventId(new Guid("FFF291EF-1911-4C7C-BB30-89C29F0D6D3E"));
            @event.DeviceId    = new Guid("6BAAB117-6D9B-404A-AB6A-4AE7A8DA856C");
            @event.VectorClock = new VectorClock();

            eventStore.Add(@event);

            Assert.Contains(@event, eventStore.GetEvents().ToList());
        }
Beispiel #12
0
        public void When_CreatingNewEvent_Then_SQLRepositoryAddEventShouldBeCalled()
        {
            //Arrange
            var mock = new Mock <IEventRepository>();

            mock.Setup(x => x.Add(It.IsAny <Event>()));
            var sut = new EventStore(mock.Object);

            //Act
            sut.Add(new Event());

            //Assert
            mock.VerifyAll();
        }
Beispiel #13
0
        public void OnlyAddedEventsAreInStore()
        {
            var eventStore = new EventStore();
            var @event     = new TestEvent();

            @event.AggregateId = new TestEventId(new Guid("FFF291EF-1911-4C7C-BB30-89C29F0D6D3E"));
            @event.DeviceId    = new Guid("6BAAB117-6D9B-404A-AB6A-4AE7A8DA856C");
            @event.VectorClock = new VectorClock();

            eventStore.Add(@event);

            var events = eventStore.GetEvents().ToList();

            Assert.That(() => events.All(x => ReferenceEquals(x, @event) && events.Count == 1));
        }
        public void Handle(BecomeCustomerCommand command)
        {
            var state = AccountState.FromStorage(AccountStore.AccountStates.SingleOrDefault(x => x.Email == command.Email)) ?? new AccountState();

            var agg = Account.Create(state);

            agg.BecomeCustomer(command.Email, command.Username);

            foreach (var change in agg.Changes())
            {
                EventStore.Add(change);
            }

            AccountStore.AccountStates.Add(state.ToStorage());
        }
        public void ShouldReconstituteLevelFromCreatedEvent()
        {
            var organizationId = new OrganizationId();
            var events         = new EventStore();

            DomainEvents.Register((IDomainEvent evt) => events.Add(organizationId, evt));

            var levelId = new LevelId();
            var level   = new Level(levelId, new StructureId(), "Level Name");

            var repo = new DomainRepository(organizationId, events);

            var clonedLevel = repo.GetLevel(levelId);

            clonedLevel.ShouldBeEquivalentTo(level);
        }
        public void ShouldResolveSimpleEventStream()
        {
            var eventStore = new EventStore();
            var events     = new IDomainEvent[]
            {
                new DraftCreatedEvent(organizationId, null),
                new StructureCreatedEvent(structureId),
                new LevelCreatedEvent(structureId, new LevelId(), "Level"),
            };

            foreach (var domainEvent in events)
            {
                eventStore.Add(organizationId, domainEvent);
            }

            eventStore.GetEvents(organizationId).Should().Equal(events);
        }
Beispiel #17
0
        /// <summary>
        /// 自动订阅所有事件数据及其处理类型
        /// </summary>
        /// <param name="eventHandlerTypes">事件处理器类型集合</param>
        public virtual void SubscribeAll(Type[] eventHandlerTypes)
        {
            Check.NotNull(eventHandlerTypes, nameof(eventHandlerTypes));

            foreach (Type eventHandlerType in eventHandlerTypes)
            {
                Type handlerInterface = eventHandlerType.GetInterface("IEventHandler`1"); //获取该类实现的泛型接口
                if (handlerInterface == null)
                {
                    continue;
                }
                Type eventDataType           = handlerInterface.GetGenericArguments()[0]; //泛型的EventData类型
                IEventHandlerFactory factory = new IocEventHandlerFactory(_serviceProvider, eventHandlerType);
                EventStore.Add(eventDataType, factory);
                Logger.LogDebug($"创建事件“{eventDataType}”到处理器“{eventHandlerType}”的订阅配对");
            }
            Logger.LogInformation($"共从程序集创建了 {eventHandlerTypes.Length} 个事件处理器的事件订阅");
        }
        public void Handle(AddCreditCardCommand command)
        {
            var state = AccountState.FromStorage(AccountStore.AccountStates.SingleOrDefault(x => x.Email == command.Email));

            if (state == null)
            {
                throw new Exception("Not found");
            }

            var agg = Domain.Account.Create(state);

            agg.AddCreditCard(command.CreditCard);

            foreach (var change in agg.Changes())
            {
                EventStore.Add(change);
            }

            AccountStore.Update(state.ToStorage());
        }
Beispiel #19
0
        public void EventsSurviveSerialisationRoundtrip()
        {
            var eventStore = new EventStore();
            var @event     = new TestEvent();

            @event.AggregateId = new TestEventId(new Guid("FFF291EF-1911-4C7C-BB30-89C29F0D6D3E"));
            @event.DeviceId    = new Guid("6BAAB117-6D9B-404A-AB6A-4AE7A8DA856C");
            @event.VectorClock = new VectorClock();

            eventStore.Add(@event);

            Serialiser.KnownTypes = new Type[]
            {
                typeof(TestEvent),
                typeof(TestEventId),
            };

            var clonedState = Serialiser.CloneSerialisable(eventStore.State);

            Assert.That(() => eventStore.State.Events.SequenceEqual(clonedState.Events));
        }
Beispiel #20
0
 /// <summary>
 /// 订阅指定事件数据的事件处理类型
 /// </summary>
 /// <typeparam name="TEventData">事件数据类型</typeparam>
 /// <typeparam name="TEventHandler">事件处理器类型</typeparam>
 public virtual void Subscribe <TEventData, TEventHandler>() where TEventData : IEventData where TEventHandler : IEventHandler, new()
 {
     EventStore.Add <TEventData, TEventHandler>();
 }
Beispiel #21
0
 public EventStoreBuilder Add <TAggregateRoot>(TAggregateRoot aggregateRoot)
     where TAggregateRoot : AggregateRoot
 {
     _store.Add(aggregateRoot);
     return(this);
 }