Справочная информация: У меня есть служба WCF с SimpleInjector в качестве IoC, которая создает экземпляр DbContext для запроса WCF.Как проверить, имеет ли транзакция DbContext транзакцию?
Сам бэкэнд - это CQRS. CommandHandlers много декораторов (проверка, авторизация, регистрация, некоторые общие правила для различных групп обработчиков и т.д.), и один из них является сделка декоратор:
public class TransactionCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand>
where TCommand : ICommand
{
private readonly ICommandHandler<TCommand> _handler;
private readonly IMyDbContext _context;
private readonly IPrincipal _principal;
public TransactionCommandHandlerDecorator(ICommandHandler<TCommand> handler,
IMyDbContext context, IPrincipal principal)
{
_handler = handler;
_context = context;
_principal = principal;
}
void ICommandHandler<TCommand>.Handle(TCommand command)
{
using (var transaction = _context.Database.BeginTransaction())
{
try
{
var user = _context.User.Single(x => x.LoginName == _principal.Identity.Name);
_handler.Handle(command);
_context.SaveChangesWithinExplicitTransaction(user);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw;
}
}
}
}
Проблема возникает, когда любая команда, пытается цепь выполнить другую команду в пределах тот же запрос WCF. я получил ожидаемое исключение в этой строке:
using (var transaction = _context.Database.BeginTransaction())
, потому что мой экземпляр DbContext уже имеет сделку.
Есть ли способ проверить существование текущей транзакции?
Вам не хватает [целостной абстракции] (http://qujck.com/commands-and-queries-are-holistic-abstractions/) – qujck
@qujck после прочтения этой статьи Я не понимаю, в чем разница между ' IQuery 'и' IDataQuery '. Оба они возвращают данные. Для чего нужен второй интерфейс? Есть ли примеры? –
Szer
Они оба возвращают данные, но эти различные абстракции важны только тогда, когда речь идет о декорировании вашего кода. Вам нужна одна абстракция, которая владеет всей операцией, абстракцией, которую можно обернуть чем-то вроде «TransactionDecorator». У вас есть другие абстракции нижнего уровня, которые могут быть украшены сквозными проблемами, такими как «AuthoriseDecorator» или «LoggingDecorator», которые не связаны с атомной операцией. – qujck