//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);//发布事件
                }
            });
        }
        public TAggregate GetNew <TAggregate>() where TAggregate : class, IAggregateRoot, new()
        {
            var model = new TAggregate {
                Context = _context, Version = -1
            };

            return(model);
        }
Exemple #3
0
 public LeafwardNode(KeyVal data, bool isRed, LeafwardNode left, LeafwardNode right, Func <TAggregate, TKey, TVal, TAggregate, TAggregate> aggregator)
 {
     this.Data      = data;
     this.Left      = left;
     this.Right     = right;
     this.IsRed     = isRed;
     this.Aggregate = data == null ? default(TAggregate) : aggregator(left.Aggregate, data.Key, data.Val, right.Aggregate);
     this.Count     = data == null ? 0 : left.Count + 1 + right.Count;
 }
            public void SetNewVersion(TAggregate aggregate)
            {
                if (this.CurrentVersion != null)
                {
                    this.History.Push(this.CurrentVersion);
                    aggregate.Version++;
                }
                else
                {
                    this.Id           = aggregate.Id;
                    aggregate.Version = 1;
                }

                this.CurrentVersion = aggregate;
            }
        /// <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);
                }
            });
        }
Exemple #6
0
        /// <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);
                }
            });
        }
 internal static Entry AddedInMemory(TAggregate aggregate)
 => new Entry(aggregate, EntryState.Added);
 internal static Entry LoadedFromDatabase(TAggregate aggregate)
 => new Entry(aggregate, EntryState.Loaded);
 private Entry(TAggregate aggregate, EntryState state)
 {
     Aggregate = aggregate;
     State     = state;
 }