示例#1
0
        public Task HandleAsync(SeatsReserved evnt)
        {
            return(TryTransactionAsync(async(connection, transaction) =>
            {
                var effectedRows = await connection.UpdateAsync(new
                {
                    Version = evnt.Version,
                    EventSequence = evnt.Sequence
                }, new
                {
                    Id = evnt.AggregateRootId,
                    Version = evnt.Version - 1
                }, ConfigSettings.ConferenceTable, transaction);

                if (effectedRows == 1)
                {
                    var tasks = new List <Task>();

                    //插入预定记录
                    foreach (var reservationItem in evnt.ReservationItems)
                    {
                        tasks.Add(connection.InsertAsync(new
                        {
                            ConferenceId = evnt.AggregateRootId,
                            ReservationId = evnt.ReservationId,
                            SeatTypeId = reservationItem.SeatTypeId,
                            Quantity = reservationItem.Quantity
                        }, ConfigSettings.ReservationItemsTable, transaction));
                    }

                    //更新位置的可用数量
                    foreach (var seatAvailableQuantity in evnt.SeatAvailableQuantities)
                    {
                        tasks.Add(connection.UpdateAsync(new
                        {
                            AvailableQuantity = seatAvailableQuantity.AvailableQuantity
                        }, new
                        {
                            ConferenceId = evnt.AggregateRootId,
                            Id = seatAvailableQuantity.SeatTypeId
                        }, ConfigSettings.SeatTypeTable, transaction));
                    }

                    await Task.WhenAll(tasks);
                }
            }));
        }
示例#2
0
        public when_reservation_confirmation_is_received_for_non_current_correlation_id()
        {
            var makeReservationCommand = sut.Commands.Select(e => e.Body).OfType <MakeSeatReservation>().Single();

            var seatsReserved = new SeatsReserved {
                SourceId = conferenceId, ReservationId = makeReservationCommand.ReservationId, ReservationDetails = new SeatQuantity[0]
            };

            try {
                sut.Handle(new Envelope <SeatsReserved>(seatsReserved)
                {
                    CorrelationId = Guid.NewGuid().ToString()
                });
            } catch (InvalidOperationException e) {
                exception = e;
            }
        }
示例#3
0
        private void OnSeatsReserved(SeatsReserved e)
        {
            var details = e.ReservationDetails.ToList();

            if (details.Count > 0)
            {
                pendingReservations[e.ReservationId] = details;
            }
            else
            {
                pendingReservations.Remove(e.ReservationId);
            }

            foreach (var seat in e.AvailableSeatsChanged)
            {
                remainingSeats[seat.SeatType] = remainingSeats[seat.SeatType] + seat.Quantity;
            }
        }
        public void Setup()
        {
            this._sut          = new RegistrationProcessManager();
            this._orderId      = Guid.NewGuid();
            this._conferenceId = Guid.NewGuid();

            var seatType = Guid.NewGuid();

            this._sut.Handle(
                new OrderPlaced {
                SourceId     = this._orderId,
                ConferenceId = this._conferenceId,
                Seats        = new[] { new SeatQuantity(Guid.NewGuid(), 2) },
                ReservationAutoExpiration = DateTime.UtcNow.Add(TimeSpan.FromMinutes(22))
            });

            var makeReservationCommand = this._sut.Commands.Select(e => e.Body).OfType <MakeSeatReservation>().Single();

            this._reservationId = makeReservationCommand.ReservationId;

            this._sut.Handle(
                new Envelope <SeatsReserved>(
                    new SeatsReserved {
                SourceId           = this._conferenceId,
                ReservationId      = makeReservationCommand.ReservationId,
                ReservationDetails = new[] { new SeatQuantity(seatType, 2) }
            })
            {
                CorrelationId = makeReservationCommand.Id.ToString()
            });


            var makeReservationCommand1 = _sut.Commands.Select(e => e.Body).OfType <MakeSeatReservation>().Single();

            var seatsReserved = new SeatsReserved {
                SourceId = this._conferenceId, ReservationId = makeReservationCommand.ReservationId, ReservationDetails = new SeatQuantity[0]
            };

            this._initialCommandCount = this._sut.Commands.Count();
            _sut.Handle(new Envelope <SeatsReserved>(seatsReserved)
            {
                CorrelationId = makeReservationCommand1.Id.ToString()
            });
        }
示例#5
0
        public void MakeReservation(Guid reservationId, IEnumerable <SeatQuantity> wantedSeats)
        {
            var wantedList = wantedSeats.ToList();

            if (wantedList.Any(x => !this._remainingSeats.ContainsKey(x.SeatType)))
            {
                throw new ArgumentOutOfRangeException("wantedSeats");
            }

            var difference = new Dictionary <Guid, SeatDifference>();

            foreach (var seatQuantity in wantedList)
            {
                var item = GetOrAdd(difference, seatQuantity.SeatType);
                item.Wanted    = seatQuantity.Quantity;
                item.Remaining = this._remainingSeats[seatQuantity.SeatType];
            }

            List <SeatQuantity> existing;

            if (this._pendingReservations.TryGetValue(reservationId, out existing))
            {
                foreach (var seatQuantity in existing)
                {
                    GetOrAdd(difference, seatQuantity.SeatType).Existing = seatQuantity.Quantity;
                }
            }

            var reservation = new SeatsReserved()
            {
                ReservationId      = reservationId,
                ReservationDetails =
                    difference.Select(x => new SeatQuantity(x.Key, x.Value.Actual)).Where(x => x.Quantity != 0).ToList(),
                AvailableSeatsChanged =
                    difference.Select(x => new SeatQuantity(x.Key, -x.Value.DeltaSinceLast)).Where(x => x.Quantity != 0)
                    .ToList()
            };

            this.Update(reservation);
        }
示例#6
0
 public void Handle(SeatsReserved @event)
 {
     UpdateAvailableQuantity(@event, @event.AvailableSeatsChanged);
 }
示例#7
0
        /// <summary>
        /// Handle the event.
        /// </summary>
        /// <param name="event">The <see cref="IEvent"/> to handle.</param>
        public Task HandleAsync(SeatsReserved @event)
        {
            MakePayment makePayment = new MakePayment();

            return(this.EventContext.Request.Processor.ProcessAsync(makePayment));
        }