Hintergrund: Ich habe WCF-Dienst mit SimpleInjector als IoC, die Instanz von DbContext pro WCF-Anforderung erstellt.Wie überprüft man, ob DbContext eine Transaktion hat?
Backend selbst ist CQRS. CommandHandlers haben viele Dekorateure (Validierung, Autorisierung, Protokollierung, einige gemeinsame Regeln für verschiedene Behandlungsgruppen usw.) und einer von ihnen ist Transaktion 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;
}
}
}
}
Problem tritt auf, wenn alle Befehl versucht, Kette innerhalb der anderen Befehl ausführen gleiche WCF-Anfrage. Ich habe eine erwartete Ausnahme bei dieser Zeile:
using (var transaction = _context.Database.BeginTransaction())
weil meine DbContext Instanz bereits eine Transaktion besitzt.
Gibt es eine Möglichkeit, aktuelle Transaktionen zu überprüfen?
Sie vermissen eine [holistische Abstraktion] (http://qujck.com/commands-and-queries-are-holistic-abstractions/) – qujck
@qujck nach dem Lesen dieses Artikels Ich verstehe nicht, was der Unterschied zwischen ' IQuery 'und' IDataQuery '. Beide geben Daten zurück. Warum brauchen wir dafür eine zweite Schnittstelle? Gibt es einige Beispiele? –
Szer
Sie geben beide Daten zurück, aber diese verschiedenen Abstraktionen sind nur wichtig, wenn es darum geht, Ihren Code zu dekorieren. Sie benötigen eine Abstraktion, die die gesamte Operation besitzt, eine Abstraktion, die mit etwas wie einem TransactionDecorator umhüllt werden kann. Sie haben andere, untergeordnete Abstraktionen, die mit übergreifenden Themen wie "AuthoriseDecorator" oder "LoggingDecorator" dekoriert werden können, die sich nicht mit der atomaren Operation befassen. – qujck