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; } }
public DomainEventProcessor( IDomainEventingContext context, ILogger <DomainEventProcessor <TDomainEvent> > logger) { _logger = logger; _context = context; }
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); }
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); }
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); }
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); }
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); }
/// <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); }
/// <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); }
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); }
/// <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)); } }
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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }