Beispiel #1
0
        /// <summary>
        /// Runs async commands queue
        /// </summary>
        /// <returns></returns>
        public async Task SaveAsync(OuterTransactionMode transaction     = OuterTransactionMode.None,
                                    OuterTransactionIsolationLevel level = OuterTransactionIsolationLevel.Chaos)
        {
            if (_actions.IsRunning)
            {
                throw new Exception(".SaveAsync cannot be called within post-save action");
            }
            if (_finallyActions.IsRunning)
            {
                throw new Exception(".SaveAsync cannot be called within finally action");
            }
            IOuterTransaction tran   = ObtainTransaction(transaction, level);
            Exception         thrown = null;

            try
            {
                await _serviceManager.OnSaveAsync();

                CommandsDispatcher dispatcher = new CommandsDispatcher(_mx, _aux.TraceCollector);
                await dispatcher.DispatchAsync(_pipeline, _actions);

                await _serviceManager.OnFinallyAsync();

                await _finallyActions.RunAsync();

                await dispatcher.DispatchAsync(_pipeline, _actions);

                tran?.Commit();
                //CleanupAfterSave();
            }
            catch (Exception ex)
            {
                _exceptionHandler?.Invoke(ex);
                thrown = ex;
            }
            finally
            {
                try
                {
                    tran?.Dispose();
                }
                catch (Exception)
                {
                    if (thrown == null)
                    {
                        throw;
                    }
                }
                if (thrown != null)
                {
                    throw thrown;
                }
            }
        }
Beispiel #2
0
        private IOuterTransaction ObtainTransaction(
            OuterTransactionMode transaction,
            OuterTransactionIsolationLevel level)
        {
            if (_tranManager == null)
            {
                return(new FakeOuterTransaction(level));
            }

            if (transaction == OuterTransactionMode.DbTransaction)
            {
                return(_tranManager.BeginDbTransaction(level));
            }
            if (transaction == OuterTransactionMode.TransactionScope)
            {
                return(_tranManager.BeginDbTransaction(level));
            }
            return(new FakeOuterTransaction(level));
        }