Domain driven design 在应用程序服务中使用transactionscope

Domain driven design 在应用程序服务中使用transactionscope,domain-driven-design,Domain Driven Design,在我当前的payment gateway应用程序中,我希望执行以下步骤 从贝宝转移资金 将付款记录保存在数据库中 将用户的资金(在我们的数据库中)增加他转移的金额 我正在应用层中执行所有这些步骤。交易范围内 下面是代码 public void DepositFundInAdvertiser(PaymentInfo paymentInfo, RegistrationID advertiserRegistrationID) { using (Transact

在我当前的payment gateway应用程序中,我希望执行以下步骤

  • 从贝宝转移资金
  • 将付款记录保存在数据库中
  • 将用户的资金(在我们的数据库中)增加他转移的金额
  • 我正在应用层中执行所有这些步骤。交易范围内

    下面是代码

     public void DepositFundInAdvertiser(PaymentInfo paymentInfo, RegistrationID advertiserRegistrationID)
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    PaymentResult paymentResult = paymentService.DepositFund(paymentInfo);
    
                    Advertiser advertiser = advertiserRepository.Find(advertiserRegistrationID);
                    TransactionNumber transactionNumber = paymentRepository.NextTransactionNumber();
                    Payment payment = PaymentFactory.NewPayment(advertiser.Person, transactionNumber, paymentInfo, paymentResult);
    
                    paymentRepository.Save(payment);
    
                    AdvertiserBalance newBalance = new AdvertiserBalance(advertiser.Balance.Amount + paymentInfo.PaymentTotal);//Increasing advertiser fund
    
                    advertiser.AddFund(newBalance);
    
                    advertiserRepository.Save(advertiser);
    
                    scope.Complete();
    
    
                }
    
            }
    

    问题:我的问题是我能像这样在应用层中使用Transactionscope吗,因为所有这些操作都应该是原子的?

    我认为这是复杂性和健壮性之间的一个很好的折衷。您只需记住,通过这样做,您可以将两个存储库结合起来。如果不考虑此更改对另一个和事务基础架构的影响,您将无法更改其中一个。只要两个存储库使用完全支持分布式事务的相同数据库实例或RDBMS,一切都很好。有点

    您可能知道,纯解决方案是异步消息传递,但它引入了很多复杂性。问题是,异步消息传递的复杂性趋于平淡——随着存储库、数据存储等的增加,这种复杂性不会增加。从长远来看,这是值得的。如果您有一个这样的用例,我会支持您提出的解决方案。正如我所说的,这是一个很好的折衷,制作软件就是一个很好的折衷