У меня тонна транзакционного кода доступа к БД, смешанного с бизнес-логикой в устаревшем коде.Я хочу разделить его на сервисы и репозитории, с контролем транзакций за пределами сервисов и абстрагированием удаленных транзакций для тестируемости.
Проблема в том, что мне нужно иметь параметр 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-код, а некоторые операции требуют обращения к базе данных, поэтому я не могу просто зарегистрироватьобъекты с unitofwork и выполняют операции в методе commit.
Пожалуйста, предложите, какой шаблон можно использовать в этой ситуации для некоторого постоянного невежества и позволит контролировать транзакции на верхнем уровне.