/// <summary>
        /// The action in aggregate causes an event
        /// </summary>
        /// <typeparam name="TAggregate"></typeparam>
        /// <param name="aggregate"></param>
        /// <param name="event"></param>
        public static void Causes <TAggregate>(this TAggregate aggregate, IDomainEvent @event)
            where TAggregate : EventSourcedAggregate

        {
            ((dynamic)aggregate).Apply((dynamic)@event);
            //RedirectToApply.InvokeEventOptional(aggregate, @event); // dynamic seems faster
            EventSourcedAggregate eventSourcedAggregate = (EventSourcedAggregate)aggregate;

            eventSourcedAggregate.Version++;
            eventSourcedAggregate.AddChange(@event);
        }
示例#2
0
 public void Store(EventSourcedAggregate aggregate)
 {
     using (IDocumentSession session = store.OpenSession())
     {
         // Take non-persisted events, push them to the event stream, indexed by the aggregate ID
         IEvent[] events = aggregate.PendingEvents.ToArray();
         session.Events.Append(aggregate.Id, aggregate.PendingEvents.ToArray());
         session.SaveChanges();
     }
     // Once succesfully persisted, clear events from list of uncommitted events
     aggregate.PendingEvents.Clear();
 }
        public async Task SaveAggregateAsync(EventSourcedAggregate aggregate)
        {
            await _eventStore.SaveAggregateEventsAsync(aggregate.Id.ToString(), aggregate.UncommittedEvents());

            aggregate.ClearUncommittedEvents();
        }
示例#4
0
        protected async Task SaveAndPublish(EventSourcedAggregate eventSourcedAggregate, CancellationToken cancellationToken = default(CancellationToken))
        {
            await _context.SaveChangesAsync(cancellationToken);

            await _eventBus.Publish(eventSourcedAggregate.PendingEvents.ToArray());
        }