/// <summary> /// Registers the by convention. /// </summary> /// <param name="aggregate">The aggregate.</param> public void RegisterByConvention(AggregateRoot aggregate) { if (aggregate == null) { throw new ArgumentNullException("aggregate"); } var eventType = typeof(Event); var actionType = typeof(Action <>); //var actionEventType = typeof(Action<Event>); //var covariantCastMethod = typeof(ExpressionEx).GetMethod("CovariantCast"); var handlerInfos = aggregate.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .Where(x => !x.IsGenericMethod && x.Name == "HandleEvent") .Select(methodInfo => { var parameters = methodInfo.GetParameters(); Type derivedEventType; if (parameters.Length != 1 || !(derivedEventType = parameters[0].ParameterType).IsSubclassOf(eventType)) { return(null); } return(new HandlerPair { EventType = derivedEventType, Handler = ((Event e) => methodInfo.Invoke(aggregate, new[] { e })) }); //var derivedActionDelegate = Delegate.CreateDelegate(actionType.MakeGenericType(derivedEventType), aggregate, methodInfo); //var actionEventDelegate = (Action<Event>)Delegate.CreateDelegate(actionEventType, covariantCastMethod.MakeGenericMethod(eventType, derivedEventType)); //return new HandlerPair { EventType = derivedEventType, Handler = actionEventDelegate }; }) .Where(x => x != null); foreach (var handlerInfo in handlerInfos) { RegisterHandler(handlerInfo.EventType, (Action <Event>)handlerInfo.Handler); } }
/// <summary> /// Makes the snapshot. /// </summary> /// <param name="aggregate">The aggregate.</param> /// <param name="predicate">The predicate.</param> public void MakeSnapshot(AggregateRoot aggregate, Func <IAggregateRootRepository, AggregateRoot, bool> predicate) { if (aggregate == null) { throw new ArgumentNullException("aggregate"); } ICanAggregateRootSnapshot snapshoter; if (_snapshotStore != null && (snapshoter = (aggregate as ICanAggregateRootSnapshot)) != null) { if (predicate == null || predicate(this, aggregate)) { _snapshotStore.SaveSnapshot(aggregate.GetType(), snapshoter.GetSnapshot()); } } }