従来のコードでは、ビジネスロジックと混在する大量のトランザクションdbアクセスコードがあります。 私はそれをサービスとリポジトリに分け、トランザクションの制御をサービスの外に置いて、テスト容易化のためにトランザクションを抽象化したいと考えています。サービス/リポジトリ/ユニットワークとのトランザクション
問題は、私はのIDbConnectionパラメータを持っている必要があります、あり、両方のサービスとリポジトリ層内のすべてのメソッドシグネチャのために、トランザクションに参加し、そしてそれは、私は確かに好きではないです:
void Process(Stuff s, IDbConnection connection);
私が欲しいです
void Process(Stuff stuff, User u)
{
using(var UoW = ???) // Start transaction
{
// various operations in the same transaction
if(AuthorizationService.AuthorizesUserForStuff(u,stuff))
{
StuffService.Process(stuff);
AuditService.Success(u, stuff);
}
else
AuditService.Failure(u,stuff);
UoW.Commit();
}
}
リポジトリ:
void Process(Stuff s)
{
IDbCommand command = ??? //aware of current UnitOfWork
...
command.ExecuteNonQuery();
}
トップレベルの方法ではこのような何かを持っている方法を把握します
レガシーコードはORMを使用していません。ストアドプロシージャとカスタムSQLコードが多く、データベースへのラウンドトリップが必要な操作もあります。単体でオブジェクトを登録してコミット操作を行うことはできません方法。
この状況では、いくつかの永続性の無知のためにどのパターンを使用できるかを提案し、最上位レベルでトランザクションを制御できるようにしてください。