internal void ApplyInitialEvent(LoadedEvent @event) { if (_changes.Any()) { throw new Exception("ApplyInitialEvent can only be used for a new aggregate"); } _changes.Add(@event); }
bool IEventApplier.ProcessMessage(LoadedEvent loadedEvent) { if (_messageHandlerDictionary.TryGetValue(loadedEvent.Data.GetType(), out var handler)) { handler.Execute(loadedEvent); return(true); } return(false); }
// push atomic aggregate changes to local history for further processing (EventStore.SaveEvents) private void ApplyChange(LoadedEvent @event, bool isNew) { IEventApplier applier = this; applier.ProcessMessage(@event); if (isNew) { _changes.Add(@event); } }
private TAggregateRoot CreateInternal(LoadedEvent firstLoadedEvent) { var eventType = firstLoadedEvent.Data.GetType(); var typedEventType = typeof(TypedEvent <>).MakeGenericType(eventType); var typedEvent = typedEventType.GetConstructors().First().Invoke(new object[] { firstLoadedEvent.EventDateTime, firstLoadedEvent.Data }); var constructors = typeof(TAggregateRoot).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); if (constructors.Length == 1) { var constructor = constructors[0]; if (constructor.IsPrivate) { var paramTypes = constructor.GetParameters(); if (paramTypes.Length == 1 && paramTypes[0].ParameterType == typedEventType) { return((TAggregateRoot)constructor.Invoke(new object[] { typedEvent })); } } } throw new Exception($"Aggregate {typeof(TAggregateRoot).Name} must have 1 private constructor(TypedEvent<{eventType.Name}> initialEvent)"); }
internal abstract void Execute(LoadedEvent loadedEvent);