public static bool Publish <T>(DomainEventHandlerData <T> @event) where T : DomainEvent
        {
            Func <DomainEventHandlerData <IDomainEvent>, bool> handlers;

            if (!Routes.TryGetValue(@event.Event.GetType(), out handlers))
            {
                return(false);
            }
            return((bool)handlers.DynamicInvoke(@event));
        }
        public static dynamic CreateDynamicInstance(Type type, DomainEventHandlerData <DomainEvent> data)
        {
            dynamic a = Activator.CreateInstance(type);

            a.Event    = data.Event;
            a.Snapshot = data.Snapshot;
            a.Store    = data.Store;
            a.Id       = data.Id;
            return(a);
        }
        private static void InvokeHandler(Type @interface, IHandlerRegistrar bus, Type executorType)
        {
            var commandType            = @interface.GenericTypeArguments[0];
            var registerExecutorMethod = bus
                                         .GetType().GetRuntimeMethods()
                                         .Where(mi => mi.Name == "RegisterHandler")
                                         .Where(mi => mi.IsGenericMethod)
                                         .Where(mi => mi.GetGenericArguments().Count() == 1)
                                         .Single(mi => mi.GetParameters().Count() == 1)
                                         .MakeGenericMethod(commandType);

            var del = new Func <dynamic, bool>(x =>
            {
                dynamic handler = _container.Resolve(@interface);
                var d1          = typeof(DomainEventHandlerData <>);
                Type[] typeArgs = { x.Event.GetType() };
                var makeme      = d1.MakeGenericType(typeArgs);
                var a           = DomainEventHandlerData <DomainEvent> .CreateDynamicInstance(makeme, x);
                return(handler.Handle(a));
            });

            registerExecutorMethod.Invoke(bus, new object[] { del });
        }
        public bool Handle(DomainEventHandlerData <CreateSoldierEvent> data)
        {
            if (data.EventObject.RunningAt.Add(data.EventObject.ProductionTime).CompareTo(DateTime.UtcNow) >= 1)
            {
                var remainTime = data.EventObject.RunningAt.Add(data.EventObject.ProductionTime).Subtract(DateTime.UtcNow);
                Console.WriteLine($"Need {remainTime.TotalSeconds} seconds to production new soldier...");
                return(false);
            }
            var gameSnapshot = data.Snapshot as CastleAggregate;

            if (gameSnapshot != null)
            {
                Console.WriteLine("Soldier created!");
                gameSnapshot.SoldiersAmount++;
                gameSnapshot.Soldiers.Add(data.EventObject.Id);
            }
            Console.WriteLine("Create more soldier...");
            Program.MessageHub.Publish(new SoldierCreatedEvent(this)
            {
                EndedAt = data.EventObject.RunningAt.Add(data.EventObject.ProductionTime)
            });
            return(true);
        }