Я помню, что Мартин Фаулер рекомендует сохранять контроль над транзакцией на бизнес-уровне, потому что транзакция является бизнес-проблемой. (Если вы разрабатываете класс BankAccount, транзакция является частью языка домена).
Вы можете попробовать реализовать TransactionScope, так как в .NET он работает примерно так
using (TransactionScope ts = new TransactionScope())
{
...
}
Это то же самое, что и (не совсем, но если вы парень из Java, это более очевидно для вас)
TransactionScope scope = new TransactionScope();
try
{
...
scope.Commit();
}
catch(Exception ex)
{
scope.Rollback();
throw;
}
Чтобы отделить бизнес-уровень от любых технологий DAO, вы можете добавить TransactionFactory на языке вашего домена, который возвращает ITransactionScope (интерфейс), который вы определили с помощью методов Commit и Rollback. Таким образом, ваш уровень домена не привязан к уровню DAO, а только конкретная реализация TransactionFactory.
ITransactionScope scope = transactionFactory.CreateTransaction();
try
{
...
scope.Commit();
}
catch(Exception ex)
{
scope.Rollback();
throw;
}