Esempio n. 1
0
        /// <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());
                }
            }
        }