Sfondo: Ho un servizio WCF con SimpleInjector come IoC che crea un'istanza di DbContext per richiesta WCF.Come verificare se DbContext ha una transazione?
Il backend stesso è CQRS. CommandHandlers hanno un sacco di decoratori (convalida, autorizzazione, la registrazione, alcune regole comuni per i diversi gruppi di gestore, ecc) e uno di loro è Transaction Decorator:
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;
}
}
}
}
problema si verifica quando eventuali tentativi di comando a catena eseguire un altro comando all'interno della stessa richiesta WCF. Ho trovato un'eccezione prevista in questa linea:
using (var transaction = _context.Database.BeginTransaction())
perché il mio esempio DbContext ha già una transazione.
Esiste un modo per verificare l'esistenza della transazione corrente?
Ti manca una [astrazione olistica] (http://qujck.com/commands-and-queries-are-holistic-abstractions/) – qujck
@qujck dopo aver letto questo articolo non capisco quale sia la differenza tra IQuery 'e' IDataQuery '. Entrambi restituiscono i dati. Perché abbiamo bisogno di una seconda interfaccia per questo? Ci sono degli esempi? –
Szer
Entrambi restituiscono dati ma queste diverse astrazioni sono importanti solo quando si tratta di decorare il codice. Hai bisogno di un'astrazione che possiede l'intera operazione, un'astrazione che può essere avvolta con qualcosa come un "TransactionDecorator". Avete altre astrazioni di livello inferiore che possono essere decorate con preoccupazioni trasversali come 'AuthoriseDecorator' o' LoggingDecorator' che non riguardano l'operazione atomica. – qujck