protected void ApplyChange(Event domainEvent)
 {
     domainEvent.AggregateId = Id;
     domainEvent.Version = ++EventVersion;
     Apply(domainEvent);
     _changes.Add(domainEvent);
 }
        public async void PassSubscriptionWithNonGenericParameter()
        {
            var messageBus = new MessageBus();

            var expected = new Event();
            Event actual = null;

            messageBus.Subscribe<Event>((e) => actual = e);

            await messageBus.Publish(expected);

            Assert.Equal(expected, actual);
        }
        public void GetAnAggregateWithSomeEventsReturnsEvents()
        {
            var aggregateId = Guid.NewGuid();
            var @event = new Event();
            var storageMock = new EventStoreMock().SeedEvents(aggregateId, @event);
            var repository = new Repository<AggregateRootMock>(storageMock);

            var rootMock = new AggregateRootMock(aggregateId);
            rootMock.SomeEvent(@event);

            repository.Save(rootMock, 0);
            var actualRoot = repository.GetById(aggregateId);
            
            Assert.Equal(@event, actualRoot.MyEvent);
        }
        public void SavingAnAggregateWithSomeEventsStoresThoseEventsInTheEventStore()
        {
            var storageMock = new EventStoreMock();
            var repository = new Repository<AggregateRootMock>(storageMock);

            var rootMock = new AggregateRootMock(Guid.NewGuid());
            var @event = new Event();
            rootMock.SomeEvent(@event);

            repository.Save(rootMock, 0);

            storageMock.AssertSaveCalls(1);
            Assert.Equal(@event, rootMock.MyEvent);
            Assert.Equal(1, storageMock.LatestEvents.Count());
            var storedEvent = storageMock.LatestEvents.First();
            Assert.Equal(@event, storedEvent);
        }
 public void SomeEvent(Event @event, object a = null)
 {
     ApplyChange(@event);
 }
 protected void OnEvent(Event @event)
 {
     MyEvent = @event;
 }
        protected void Apply(Event domainEvent)
        {
            //var eventType = domainEvent.GetType();

            //string methodName = $"On{eventType.GetNonGenericName()}";

            this.InvokeMethodMatchingParameters(domainEvent);

            //var methodInfo = this
            //    .GetMethodInfoMatchingSignature(methodName, domainEvent)
            //    .FirstOrDefault();

            //foreach (var entity in _entities)
            //{
            //    if (methodInfo != null)
            //    {
            //        break;
            //    }
            //    methodInfo = entity.
            //        GetMethodInfoMatchingSignature(methodName, domainEvent)
            //        .FirstOrDefault();
            //}

            foreach (var entity in _entities)
            {
                entity.InvokeMethodMatchingParameters(domainEvent);
            }

            //I'm not sure if this will work here...
            //if (eventType.IsConstructedGenericType)
            //{
            //    var genericTypeParameters = eventType.GenericTypeArguments;
            //    methodInfo = methodInfo.MakeGenericMethod(genericTypeParameters);
            //}

            //methodInfo.Invoke(this, new object[] { domainEvent });
        }