public IInitialQueryBuilder Query(TransactionDomain domain)
 {
     if (_transactionDomain != domain)
     {
         throw new InvalidOperationException("The transaction does not have the specified domain.");
     }
     return(Query());
 }
 public IInitialQueryBuilder Query(TransactionDomain domain)
 {
     if (_currentTransaction.Value is null)
     {
         throw new InvalidOperationException("You can only start a query from withing a transaction context.");
     }
     return(_currentTransaction.Value.Query(domain));
 }
        public ITransaction BeginTransaction(TransactionDomain domain)
        {
            lock (_lock) {
                if (_currentTransaction.Value is not null)
                {
                    throw new InvalidOperationException("You already have a transaction within this thread.");
                }

                var transaction = new Transaction(domain);
                transaction.OnClosed += (o, e) => OnClosedTransaction((Transaction)o, e);
                transaction.Start();

                _currentTransaction.Value = transaction;

                return(transaction);
            }
        }
 public TransactionEventArgs(TransactionDomain domain) => TransactionDomain = domain;
 public T WithTransaction <T>(TransactionDomain domain, Func <ITransaction, T> function)
 {
     using (var transaction = BeginTransaction(domain)) {
         return(function(transaction));
     }
 }
 public void WithTransaction(TransactionDomain domain, Action <ITransaction> function)
 {
     using (var transaction = BeginTransaction(domain)) {
         function(transaction);
     }
 }
 public Transaction(TransactionDomain domain)
 {
     _raisedEvents      = new List <DomainEvent>();
     _transactionDomain = domain;
     IsOpen             = false;
 }