在应用程序服务中使用transactionscope

时间:2011-06-04 16:46:37

标签: domain-driven-design

在我当前的支付网关应用程序中,我想执行此步骤

  1. 从PayPal转账。
  2. 将付款记录保存在数据库中
  3. 按照转移的金额增加用户的资金(在我们的数据库中)。
  4. 我正在应用层执行所有这些步骤。内部交易范围

    以下是代码

     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();
    
    
                }
    
            }
    

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

1 个答案:

答案 0 :(得分:2)

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

您可能知道,纯解决方案是异步消息传递,但它引入了很多复杂性。问题是,与异步消息传递相关的复杂性往往是平坦的 - 它不会随着您添加更多存储库,更多数据存储等而增长。从长远来看,它会得到回报。如果你有一个这样的用例,我会选择你提出的解决方案。正如我所说,这是一个很好的妥协,使软件成为妥协妥协。

相关问题