protected void ApplyChange(VersionedDomainEvent change) { _changes.Add(change); change.Version = Version + 1; change.AggregateRootId = Identity; change.OccuredOn = DateTime.Now; change.EventType = change.GetType().Name; Version = change.Version; (this as IEventSourcedAggregateRoot).Apply(change); }
void IEventSourcedAggregateRoot.Apply(VersionedDomainEvent change) { var onMethod = GetType() .GetMethods(BindingFlags.NonPublic | BindingFlags.Instance) .Where(m => m.Name.Equals("On")) .Where(m => m.GetParameters() .SingleOrDefault(p => p.ParameterType.FullName.Equals(change.GetType().FullName)) != null); onMethod.Single().Invoke(this, new object[] { change }); }