//Command的处理 public void AddHandlerFor <TCommand, TAggregate>() where TAggregate : Aggregate, new() { if (commandHandlers.ContainsKey(typeof(TCommand))) { throw new Exception($"Command handler already registered for {typeof(TCommand).Name}"); } commandHandlers.Add(typeof(TCommand), c => { var agg = new TAggregate(); agg.Id = ((dynamic)c).Id; agg.ApplyEvents(eventStore.LoadEventsFor <TAggregate>(agg.Id)); //领域执行所有事件 var resultEvents = new List <Event>(); //所有执行的事件 foreach (var e in (agg as IHandleCommand <TCommand>).Handle((TCommand)c)) { resultEvents.Add(e); } if (resultEvents.Count > 0) { eventStore.SaveEventsFor <TAggregate>(agg.Id, agg.EventsLoaded, resultEvents);//保存事件 } foreach (var e in resultEvents) { PublishEvent(e);//发布事件 } }); }
/// <summary> /// Registers an aggregate as being the handler for a particular /// command. /// </summary> /// <typeparam name="TAggregate"></typeparam> /// <param name="handler"></param> public void AddHandlerFor <TCommand, TAggregate>() where TAggregate : Aggregate, new() { if (commandHandlers.ContainsKey(typeof(TCommand))) { throw new Exception("Command handler already registered for " + typeof(TCommand).Name); } commandHandlers.Add(typeof(TCommand), command => { // Create an empty aggregate. var aggregate = new TAggregate(); aggregate.Id = ((dynamic)command).Id; // Get all events for this aggregate and apply to aggregate // to get to current state. var allEvents = eventStore.LoadEventsFor <TAggregate>(aggregate.Id); aggregate.ApplyEvents(allEvents); // Call Handle(command) on all aggregates to yield the event (to store). var resultEvents = new List <IEvent>(); foreach (var @event in ((IHandleCommand <TCommand>)aggregate).Handle((TCommand)command)) { resultEvents.Add((IEvent)@event); } if (resultEvents.Count == 0) { return; } // Store the events in the event store. eventStore.SaveEventsFor <TAggregate>(aggregate.Id, aggregate.EventsLoaded, resultEvents); // We are done! trailer booked... but... // ...publish events to subscribers. foreach (var @event in resultEvents) { PublishEvent(@event); } }); }
/// <summary> /// Registers an aggregate as being the handler for a particular /// command. /// </summary> /// <typeparam name="TAggregate"></typeparam> /// <typeparam name="TCommand"></typeparam> public void AddHandlerFor <TCommand, TAggregate>() where TAggregate : IAggregate, new() { if (_commandHandlers.ContainsKey(typeof(TCommand))) { throw new Exception("Command handler already registered for " + typeof(TCommand).Name); } _commandHandlers.Add(typeof(TCommand), c => { // Create an empty aggregate. var agg = new TAggregate(); // Load the aggregate with events. agg.Id = ((dynamic)c).Id; agg.ApplyEvents(_eventStore.LoadEventsFor <TAggregate>(agg.Id)); // With everything set up, we invoke the command handler, collecting the // events that it produces. var resultEvents = new ArrayList(); var handleCommand = agg as IHandleCommand <TCommand>; if (handleCommand != null) { foreach (var e in handleCommand.Handle((TCommand)c)) { resultEvents.Add(e); } } // Store the events in the event store. if (resultEvents.Count > 0) { _eventStore.SaveEventsFor <TAggregate>(agg.Id, agg.Version, resultEvents); } // Publish them to all subscribers. foreach (var e in resultEvents) { PublishEvent(e); } }); }
/// <summary> /// Registers an aggregate as being the handler for a particular /// command. /// </summary> /// <typeparam name="TAggregate"></typeparam> /// <param name="handler"></param> public void AddHandlerFor <TCommand, TAggregate>() where TAggregate : Aggregate, IHandleCommand <TCommand>, new() where TCommand : ICommand { if (commandHandlers.ContainsKey(typeof(TCommand))) { throw new Exception("Command handler already registered for " + typeof(TCommand).Name); } commandHandlers.Add(typeof(TCommand), c => { // Create an empty aggregate. var agg = new TAggregate(); // Load the aggregate with events. agg.Id = c.Id; agg.ApplyEvents(eventStore.LoadEventsFor <TAggregate>(agg.Id)); // With everything set up, we invoke the command handler, collecting the // events that it produces. var resultEvents = new List <IEvent>(); foreach (var e in agg.Handle((TCommand)c)) { resultEvents.Add(e); } // Store the events in the event store. if (resultEvents.Count > 0) { eventStore.SaveEventsFor <TAggregate>(agg.Id, agg.EventsLoaded, resultEvents); } // Publish them to all subscribers. foreach (var e in resultEvents) { PublishEvent(e); } }); }