diff --git a/src/NEventLite/Core/Domain/AggregateRoot.cs b/src/NEventLite/Core/Domain/AggregateRoot.cs index 6f15070..73eefe3 100644 --- a/src/NEventLite/Core/Domain/AggregateRoot.cs +++ b/src/NEventLite/Core/Domain/AggregateRoot.cs @@ -110,7 +110,7 @@ private async Task ApplyEventAsync(IEvent, TAggregate && (CurrentVersion == @event.TargetVersion)); } - private async Task DoApplyAsync(IEvent, TAggregateKey, TEventKey> @event) + private async Task DoApplyAsync(IEvent, TAggregateKey, TEventKey> @event, bool isNew) { if (StreamState == StreamState.NoStream) { @@ -149,7 +149,8 @@ private async Task DoApplyAsync(IEvent, if (_eventHandlerCache.ContainsKey(@event.GetType())) { - await @event.InvokeOnAggregateAsync(this, _eventHandlerCache[@event.GetType()]); + var replayStatus = isNew ? ReplayStatus.Regular : ReplayStatus.Replay; + await @event.InvokeOnAggregateAsync(this, _eventHandlerCache[@event.GetType()], replayStatus); } else { diff --git a/src/NEventLite/Core/ReplayStatus.cs b/src/NEventLite/Core/ReplayStatus.cs new file mode 100644 index 0000000..4b27c96 --- /dev/null +++ b/src/NEventLite/Core/ReplayStatus.cs @@ -0,0 +1,8 @@ +namespace NEventLite.Core +{ + public enum ReplayStatus + { + Regular, + Replay + } +} \ No newline at end of file diff --git a/src/NEventLite/Util/EventExtensions.cs b/src/NEventLite/Util/EventExtensions.cs index b97f4c6..982e4a0 100644 --- a/src/NEventLite/Util/EventExtensions.cs +++ b/src/NEventLite/Util/EventExtensions.cs @@ -9,23 +9,31 @@ namespace NEventLite.Util public static class EventExtensions { public static async Task InvokeOnAggregateAsync(this IEvent, TAggregateKey, TEventKey> @event, - AggregateRoot aggregate, string methodName) + AggregateRoot aggregate, string methodName, ReplayStatus replayStatus) { var method = ReflectionHelper.GetMethod(aggregate.GetType(), methodName, new Type[] { @event.GetType() }); //Find the right method - - if (method != null) + object[] args; + if (method == null) { - var task = method.Invoke(aggregate, new object[] { @event }); //invoke with the event as argument - - if (task != null && task.GetType() == typeof(Task)) + method = ReflectionHelper.GetMethod(aggregate.GetType(), methodName, new Type[] { @event.GetType(), typeof(ReplayStatus) }); // handler with replay status + if (method == null) { - await (Task)task; + throw new AggregateEventOnApplyMethodMissingException($"No event Apply method found on {aggregate.GetType()} for {@event.GetType()}"); } + args = new object[] {@event, replayStatus}; } else { - throw new AggregateEventOnApplyMethodMissingException($"No event Apply method found on {aggregate.GetType()} for {@event.GetType()}"); + args = new object[] {@event}; + } + + var task = method.Invoke(aggregate, args); //invoke with the event handler + + if (task != null && task.GetType() == typeof(Task)) + { + await (Task)task; } + } } } diff --git a/src/NEventLite/Util/ReflectionHelper.cs b/src/NEventLite/Util/ReflectionHelper.cs index f84e995..019d8dd 100644 --- a/src/NEventLite/Util/ReflectionHelper.cs +++ b/src/NEventLite/Util/ReflectionHelper.cs @@ -25,10 +25,14 @@ public static Dictionary FindEventHandlerMethodsInAggregate