私は、いくつかのビジネス計算を実行し、データベースに一連のレコードを作成する必要がある状況 (かなり標準的だと思います) を持っています。何か問題が発生した場合は、データベースからすべてをロールバックする必要があります。明らかに、何らかのトランザクションが必要です。私の質問は、トランザクション サポートをどこに実装するかです。これが私の例です
//BillingServices - This is my billing service layer. called from the UI
public Result GenerateBill(BillData obj)
{
//Validate BillData
//Create a receivable line item in the receivables ledger
BillingRepository.Save(receivableItem);
//Update account record to reflect new billing information
BillingRepository.Save(accountRecord);
//...do a some other stuff
BillingRepository.Save(moreStuffInTheDatabase);
}
データベースへの更新のいずれかが失敗した場合は、他の更新をロールバックして終了する必要があります。呼び出すことができるリポジトリを介して接続オブジェクトを公開するだけですか?
Connection.BeginTransaction()
それとも、サービス層で検証し、すべてのオブジェクトを保存してトランザクションを処理するリポジトリ内の 1 つのメソッドを呼び出すだけですか? これは私には正しくないようです。データレイヤーに多くのビジネスロジックを配置する必要があるようです。
正しいアプローチは何ですか?複数のリポジトリにまたがる必要がある場合はどうすればよいですか (または、それは悪い設計でしょうか)。