コード例 #1
0
        public async Task OnDomainEventAsync(IDomainEventingContext context, TransferTransactionCompletedDomainEvent @event, CancellationToken token = default)
        {
            switch (@event.AccountType)
            {
            case TransferAccountType.Source:
                var updateWithdrawSql = $"UPDATE `{Tables.AccountOutTransactions}` SET `Status`=@Status,`Message`=@Message WHERE `Id`=@TransactionId;";

                await _db.ExecuteAsync(updateWithdrawSql, new
                {
                    TransactionId = @event.AggregateRootId.Id,
                    Status        = @event.Status.ToString(),
                    Message       = @event.Message.SetEmptyStringWhenNull()
                }, token);

                break;

            case TransferAccountType.Sink:
                var updateDepositSql = $"UPDATE `{Tables.AccountInTransactions}` SET `Status`=@Status,`Message`=@Message WHERE `Id`=@TransactionId;";

                await _db.ExecuteAsync(updateDepositSql, new
                {
                    TransactionId = @event.AggregateRootId.Id,
                    Status        = @event.Status.ToString(),
                    Message       = @event.Message.SetEmptyStringWhenNull()
                }, token);

                break;
            }
        }
コード例 #2
0
 public DomainEventProcessor(
     IDomainEventingContext context,
     ILogger <DomainEventProcessor <TDomainEvent> > logger)
 {
     _logger  = logger;
     _context = context;
 }
コード例 #3
0
        public async Task OnDomainEventAsync(IDomainEventingContext context, TransferTransactionStartedDomainEvent @event, CancellationToken token = default)
        {
            var insertWithdrawSql = $"INSERT INTO `{Tables.AccountOutTransactions}` (`Id`, `Type`, `AccountId`, `AccountName`, `Bank`, `Amount`, `Status`, `Creator`, `CreatedTimestamp`) VALUES (@TransactionId, @Type, @AccountId, @AccountName, @Bank, @amount, @Status, @Creator, @CreatedTimestamp);";
            var insertDepositSql  = $"INSERT INTO `{Tables.AccountInTransactions}` (`Id`, `Type`, `AccountId`, `AccountName`, `Bank`, `Amount`, `Status`, `Creator`, `CreatedTimestamp`) VALUES (@TransactionId, @Type, @AccountId, @AccountName, @Bank, @amount, @Status, @Creator, @CreatedTimestamp);";

            await _db.ExecuteAsync(insertWithdrawSql, new
            {
                TransactionId    = @event.AggregateRootId.Id,
                Type             = AccountTransactionType.Transfer.ToString(),
                AccountId        = @event.SourceAccount.Id.Id,
                AccountName      = @event.SourceAccount.Name.Name,
                Bank             = @event.SourceAccount.Bank.Name,
                Amount           = @event.Money.Amount,
                Status           = TransferTransactionStatus.Started.ToString(),
                Creator          = "justmine",
                CreatedTimestamp = @event.Timestamp
            }, token);

            await _db.ExecuteAsync(insertDepositSql, new
            {
                TransactionId    = @event.AggregateRootId.Id,
                Type             = AccountTransactionType.Transfer.ToString(),
                AccountId        = @event.SinkAccount.Id.Id,
                AccountName      = @event.SinkAccount.Name.Name,
                Bank             = @event.SinkAccount.Bank.Name,
                Amount           = @event.Money.Amount,
                Status           = TransferTransactionStatus.Started.ToString(),
                Creator          = "justmine",
                CreatedTimestamp = @event.Timestamp
            }, token);
        }
コード例 #4
0
        public async Task OnDomainEventAsync(IDomainEventingContext context, TransferTransactionSubmittedDomainEvent @event, CancellationToken token = default)
        {
            var sql = string.Empty;

            switch (@event.AccountType)
            {
            case TransferAccountType.Source:
                sql = $"UPDATE `{Tables.BankAccounts}` SET `Balance`=`Balance`-@Amount WHERE `Id`=@AccountId;";
                break;

            case TransferAccountType.Sink:
                sql = $"UPDATE `{Tables.BankAccounts}` SET `Balance`=`Balance`+@Amount WHERE `Id`=@AccountId;";
                break;
            }

            if (string.IsNullOrWhiteSpace(sql))
            {
                return;
            }

            var po = new
            {
                AccountId = @event.AggregateRootId.Id,
                Amount    = @event.Money.Amount
            };

            await _db.ExecuteAsync(sql, po, token);
        }
コード例 #5
0
        public async Task OnDomainEventAsync(IDomainEventingContext context, WithdrawTransactionSubmittedDomainEvent @event, CancellationToken token = default)
        {
            var sql = $"UPDATE `{Tables.BankAccounts}` SET `Balance`=`Balance`-@Amount WHERE `Id`=@AccountId;";

            var po = new
            {
                AccountId = @event.AggregateRootId.Id,
                Amount    = @event.Money.Amount
            };

            await _db.ExecuteAsync(sql, po, token);
        }
コード例 #6
0
        public async Task OnDomainEventAsync(IDomainEventingContext context, AccountNameChangedDomainEvent @event, CancellationToken token)
        {
            var sql = $"UPDATE `{Tables.BankAccounts}` SET `Name`=@Name WHERE `Id`=@AccountId;";

            var po = new
            {
                AccountId = @event.AggregateRootId.Id,
                Name      = @event.AccountName.Name
            };

            await _db.ExecuteAsync(sql, po, token);
        }
コード例 #7
0
        public async Task OnDomainEventAsync(IDomainEventingContext context, DepositTransactionReadiedDomainEvent @event, CancellationToken token = default)
        {
            var sql = $"UPDATE `{Tables.AccountInTransactions}` SET `Status`=@Status WHERE `Id`=@TransactionId;";

            var po = new
            {
                TransactionId = @event.AggregateRootId.Id,
                Status        = @event.Status.ToString()
            };

            await _db.ExecuteAsync(sql, po, token);
        }
コード例 #8
0
        /// <summary>
        /// 3. 从转账交易聚合根,收到交易信息已准备就绪的领域事件,向银行账户聚合根,向银行账户提交转账交易。
        /// </summary>
        /// <param name="context">事件处理上下文</param>
        /// <param name="event">交易信息已准备就绪的领域事件</param>
        public void OnDomainEvent(IDomainEventingContext context, TransferTransactionReadiedDomainEvent @event)
        {
            // 1. 从源账户取款
            var withdraw = new SubmitTransferTransactionDomainCommand(@event.AggregateRootId, @event.SourceAccountId);

            context.PublishDomainCommand(withdraw);

            // 2. 存到目标账户
            var deposit = new SubmitTransferTransactionDomainCommand(@event.AggregateRootId, @event.SinkAccountId);

            context.PublishDomainCommand(deposit);
        }
コード例 #9
0
        /// <summary>
        /// 1. 从存款交易聚合根,收到存款交易已发起的领域事件,向银行账户聚合根发起交易验证。
        /// </summary>
        /// <param name="context">事件处理上下文</param>
        /// <param name="event">存款交易已发起的领域事件</param>
        public void OnDomainEvent(IDomainEventingContext context, DepositTransactionStartedDomainEvent @event)
        {
            var command = new ValidateDepositTransactionDomainCommand()
            {
                TransactionId   = @event.AggregateRootId,
                AggregateRootId = @event.AccountId,
                AccountName     = @event.AccountName,
                Bank            = @event.Bank,
                Money           = @event.Money
            };

            context.PublishDomainCommand(command);
        }
コード例 #10
0
        public async Task OnDomainEventAsync(IDomainEventingContext context, WithdrawTransactionCancelledDomainEvent @event, CancellationToken token = default)
        {
            var sql = $"UPDATE `{Tables.AccountOutTransactions}` SET `Status`=@Status,`Message`=@Message WHERE `Id`=@TransactionId;";

            var po = new
            {
                TransactionId = @event.AggregateRootId.Id,
                Status        = @event.Status.ToString(),
                Message       = @event.Message.SetEmptyStringWhenNull()
            };

            await _db.ExecuteAsync(sql, po, token);
        }
コード例 #11
0
        /// <summary>
        /// 2.3 从转账交易聚合根,收到转账交易已取消的领域事件,通知银行账户聚合根释放在途交易。
        /// </summary>
        /// <param name="context">事件处理上下文</param>
        /// <param name="event">交易信息已准备就绪的领域事件</param>
        public void OnDomainEvent(IDomainEventingContext context, TransferTransactionCancelledDomainEvent @event)
        {
            var sourceAccount = @event.SourceAccount;
            var sinkAccount   = @event.SinkAccount;

            if (!sourceAccount.Validated)
            {
                context.PublishDomainCommand(new FreeTransferAccountTransactionDomainCommand(sourceAccount.Id, @event.AggregateRootId));
            }

            if (!sinkAccount.Validated)
            {
                context.PublishDomainCommand(new FreeTransferAccountTransactionDomainCommand(sinkAccount.Id, @event.AggregateRootId));
            }
        }
コード例 #12
0
        public async Task OnDomainEventAsync(IDomainEventingContext context, AccountOpenedDomainEvent @event, CancellationToken token = default)
        {
            var sql = $"INSERT INTO `{Tables.BankAccounts}` (`Id`, `Name`, `Bank`, `Balance`, `Creator`, `CreatedTimestamp`) VALUES (@Id, @Name, @Bank, @Balance, @Creator, @CreatedTimestamp);";

            var parameter = new
            {
                Id               = @event.AggregateRootId.Id,
                Name             = @event.AccountName.Name,
                Bank             = @event.Bank.Name,
                Balance          = @event.InitialBalance.Amount,
                Creator          = "justmine",
                CreatedTimestamp = @event.Timestamp
            };

            await _db.ExecuteAsync(sql, parameter, token);
        }
コード例 #13
0
        /// <summary>
        /// 1. 从转账交易聚合根,收到交易已发起的领域事件,向银行账户聚合根发起交易信息验证。
        /// </summary>
        /// <param name="context">事件处理上下文</param>
        /// <param name="event">交易已发起的领域事件</param>
        public void OnDomainEvent(IDomainEventingContext context, TransferTransactionStartedDomainEvent @event)
        {
            // 1. 验证源账户
            var validateSource = new ValidateTransferTransactionDomainCommand()
            {
                AggregateRootId = @event.SourceAccount.Id,
                TransactionId   = @event.AggregateRootId,
                Account         = @event.SourceAccount,
                Money           = @event.Money
            };

            context.PublishDomainCommand(validateSource);

            // 2. 验证目标账户
            var validateSink = new ValidateTransferTransactionDomainCommand()
            {
                AggregateRootId = @event.SinkAccount.Id,
                TransactionId   = @event.AggregateRootId,
                Account         = @event.SinkAccount,
                Money           = @event.Money
            };

            context.PublishDomainCommand(validateSink);
        }
コード例 #14
0
        /// <summary>
        /// 4. 从银行账户聚合根,收到取款账户交易已提交的领域事件,通知取款交易聚合根确认。
        /// </summary>
        /// <param name="context">事件处理上下文</param>
        /// <param name="event"></param>
        public void OnDomainEvent(IDomainEventingContext context, WithdrawTransactionSubmittedDomainEvent @event)
        {
            var command = new ConfirmWithdrawTransactionSubmittedDomainCommand(@event.TransactionId, @event.AccountBalance, @event.AccountInAmountInFlight, @event.AccountOutAmountInFlight);

            context.PublishDomainCommand(command);
        }
コード例 #15
0
        /// <summary>
        /// 3.1 从取款交易聚合根,收到取款交易已准备就绪的领域事件,向银行账户聚合更提交交易。
        /// </summary>
        /// <param name="context">事件处理上下文</param>
        /// <param name="event"></param>
        public void OnDomainEvent(IDomainEventingContext context, WithdrawTransactionReadiedDomainEvent @event)
        {
            var command = new SubmitWithdrawTransactionDomainCommand(@event.AggregateRootId, @event.AccountId);

            context.PublishDomainCommand(command);
        }
コード例 #16
0
        /// <summary>
        /// 1. 从取款交易聚合根,收到取款交易已发起的领域事件,向银行账户聚合根发起交易信息验证。
        /// </summary>
        /// <param name="context">事件处理上下文</param>
        /// <param name="event">交易已发起的领域事件</param>
        public void OnDomainEvent(IDomainEventingContext context, WithdrawTransactionStartedDomainEvent @event)
        {
            var command = new ValidateWithdrawTransactionDomainCommand(@event.AggregateRootId, @event.AccountId, @event.AccountName, @event.Bank, @event.Money);

            context.PublishDomainCommand(command);
        }