在我当前的支付网关应用程序中,我想执行此步骤
我正在应用层执行所有这些步骤。内部交易范围
以下是代码
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,因为所有这些操作都应该是原子的吗?
答案 0 :(得分:2)
我认为这是复杂性和稳健性之间的良好折衷。您只需要记住,通过这样做,您可以将两个存储库结合起来。如果不考虑此更改对另一个更改和事务基础结构的影响,您将无法更改任何一个。只要两个存储库使用完全支持分布式事务的相同数据库实例或RDBMS,一切都很好。排序。
您可能知道,纯解决方案是异步消息传递,但它引入了很多复杂性。问题是,与异步消息传递相关的复杂性往往是平坦的 - 它不会随着您添加更多存储库,更多数据存储等而增长。从长远来看,它会得到回报。如果你有一个这样的用例,我会选择你提出的解决方案。正如我所说,这是一个很好的妥协,使软件成为妥协妥协。