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); }