예제 #1
0
 public ConsumerAggregateData(UpdateConsumer consumer, AdjustBalance balance, AddFingerImageToConsumer finger, RemoveFingerImageFromConsumer removeFinger)
 {
     UpdateConsumerCommand              = consumer;
     AdjustBalanceCommand               = balance;
     AddFingerImageToConsumerCommand    = finger;
     RemoveFingerImageToConsumerCommand = removeFinger;
 }
예제 #2
0
        public ConsumerAggregateActor(string streamId)
        {
            this.PersistenceId = streamId;
            _isPaused          = true;

            var idParts    = streamId.Split('_');
            var employeeId = int.Parse(idParts[0]);
            var uniqueId   = Guid.Parse(idParts[1]);

            _consumerAggregateData = new ConsumerAggregateData(
                ConsumerUpdateExtensions.CreateDefaultUpdateConsumer(employeeId, uniqueId),
                new AdjustBalance(streamId, 0M, 0M, Guid.Empty),
                new AddFingerImageToConsumer(streamId, null),
                new RemoveFingerImageFromConsumer(streamId, null));

            Recover <UpdateConsumer>(e => _consumerAggregateData                = new ConsumerAggregateData(e, _consumerAggregateData.AdjustBalanceCommand, _consumerAggregateData.AddFingerImageToConsumerCommand, _consumerAggregateData.RemoveFingerImageToConsumerCommand));
            Recover <AdjustBalance>(e => _consumerAggregateData                 = new ConsumerAggregateData(_consumerAggregateData.UpdateConsumerCommand, e, _consumerAggregateData.AddFingerImageToConsumerCommand, _consumerAggregateData.RemoveFingerImageToConsumerCommand));
            Recover <AddFingerImageToConsumer>(e => _consumerAggregateData      = new ConsumerAggregateData(_consumerAggregateData.UpdateConsumerCommand, _consumerAggregateData.AdjustBalanceCommand, e, _consumerAggregateData.RemoveFingerImageToConsumerCommand));
            Recover <RemoveFingerImageFromConsumer>(e => _consumerAggregateData = new ConsumerAggregateData(_consumerAggregateData.UpdateConsumerCommand, _consumerAggregateData.AdjustBalanceCommand, _consumerAggregateData.AddFingerImageToConsumerCommand, e));
            Recover <SnapshotOffer>(offer =>
            {
                var d = offer.Snapshot as ConsumerAggregateData;
                if (d != null)
                {
                    _consumerAggregateData = d;
                }
            });
            Command <SaveSnapshotSuccess>(success =>
            {
                //DeleteMessages(success.Metadata.SequenceNr);
            });
            Command <SaveSnapshotFailure>(failure =>
            {
                // handle snapshot save failure...
                Console.WriteLine(failure.ToString());
            });

            Command <ConsumerDomainEvents.AddedToGroup>(e =>
            {
                // TODO: No reason to do anything with group yet for consumer aggregate
                //_consumer.ApplyEvent(e);
            });

            Command <ConsumerDomainEvents.RemovedFromGroup>(e =>
            {
                // TODO: No reason to do anything with group yet for consumer aggregate
                //_consumer.ApplyEvent(e);
            });

            Command <ConsumerDomainEvents.Credited>(c =>
            {
                //Console.WriteLine(_consumerAggregateData.AdjustBalanceCommand.CurrentAmount);

                var e = new AdjustBalance(
                    _consumerAggregateData.AdjustBalanceCommand.EmployeeId,
                    c.Amount,
                    _consumerAggregateData.AdjustBalanceCommand.CurrentAmount + c.Amount,
                    c.CashinUniqueId);

                Persist(e, newEvent =>
                {
                    _consumerAggregateData = new ConsumerAggregateData(_consumerAggregateData.UpdateConsumerCommand, newEvent, _consumerAggregateData.AddFingerImageToConsumerCommand, _consumerAggregateData.RemoveFingerImageToConsumerCommand);
                    SnapshotCheck();
                    //IssueCommand(_updateConsumerCommand);
                });
            });

            Command <ConsumerDomainEvents.Debited>(c =>
            {
                var e = new AdjustBalance(
                    _consumerAggregateData.AdjustBalanceCommand.EmployeeId,
                    c.Amount,
                    _consumerAggregateData.AdjustBalanceCommand.CurrentAmount - c.Amount,
                    c.SaleUniqueId);

                Persist(e, newEvent =>
                {
                    _consumerAggregateData = new ConsumerAggregateData(_consumerAggregateData.UpdateConsumerCommand, newEvent, _consumerAggregateData.AddFingerImageToConsumerCommand, _consumerAggregateData.RemoveFingerImageToConsumerCommand);
                    SnapshotCheck();
                    //IssueCommand(_updateConsumerCommand);
                });
            });

            Command <ConsumerDomainEvents.FingerImgSet>(c =>
            {
                var e = new AddFingerImageToConsumer(
                    _consumerAggregateData.AddFingerImageToConsumerCommand.EmployeeId,
                    c.FingerImg);
                Persist(e, newEvent =>
                {
                    _consumerAggregateData = new ConsumerAggregateData(_consumerAggregateData.UpdateConsumerCommand, _consumerAggregateData.AdjustBalanceCommand, newEvent, _consumerAggregateData.RemoveFingerImageToConsumerCommand);
                    SnapshotCheck();
                    //IssueCommand(_updateConsumerCommand);
                });
            });

            Command <ConsumerDomainEvents.FingerImgRemoved>(c =>
            {
                var e = new RemoveFingerImageFromConsumer(
                    _consumerAggregateData.RemoveFingerImageToConsumerCommand.EmployeeId,
                    null /*HACK: Not used at kiosk*/);
                Persist(e, newEvent =>
                {
                    _consumerAggregateData = new ConsumerAggregateData(_consumerAggregateData.UpdateConsumerCommand, _consumerAggregateData.AdjustBalanceCommand, _consumerAggregateData.AddFingerImageToConsumerCommand, newEvent);
                    SnapshotCheck();
                    //IssueCommand(_updateConsumerCommand);
                });
            });

            Command <ResumeCommand>(c =>
            {
                // Unpause the aggregate and forward any accumulated commands

                _isPaused = false;//TODO:  Should this use become/unbecome?

                //IssueCommand(this._updateConsumerCommand);
                //IssueCommand(this._adjustBalanceCommand);
                //IssueCommand(this._addFingerImageToConsumerCommand);
                //IssueCommand(this._removeFingerImageToConsumerCommand);
            });

            CommandAny(c =>
            {
                // OPTIMIZE: Run this only if is subset of events causing UpdateConsumer to change
                var e = _consumerAggregateData.UpdateConsumerCommand.ToUpdateConsumerCommand(c);
                Persist(e, newEvent =>
                {
                    _consumerAggregateData = new ConsumerAggregateData(newEvent, _consumerAggregateData.AdjustBalanceCommand, _consumerAggregateData.AddFingerImageToConsumerCommand, _consumerAggregateData.RemoveFingerImageToConsumerCommand);
                    SnapshotCheck();
                    //IssueCommand(_updateConsumerCommand);
                });
            });
        }