public void ExecuteAllInTransaction()
        {
            _logger.LogInformation("Transaction Manager is starting the traction");
            int  index           = 0;
            bool isRollbackOccur = false;

            for (index = 0; index < Transactions.Count; index++)
            {
                IBuilderTransaction trac = Transactions[index];
                string processname       = trac.Name;
                _logger.LogInformation("{0} transaction executing", processname);
                try
                {
                    AddTransactionLevelOutputToInput(trac);
                    trac.Execute();
                    AddOutputToTransactionLevelOutput(trac);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex.ToString());
                    isRollbackOccur = true;
                    ExecuteRollBack(index - 1);
                    break;
                }
            }
            if (!isRollbackOccur)
            {
                _logger.LogInformation("Transaction completed successfully");
            }
            else
            {
                _logger.LogInformation("Transaction completed with Rollback");
            }
        }
        private void AddOutputToTransactionLevelOutput(IBuilderTransaction trac)
        {
            var tracOutput = trac.Output;

            foreach (KeyValuePair <string, object> kv in tracOutput)
            {
                if (TransactionLevelOutput.ContainsKey(kv.Key))
                {
                    TransactionLevelOutput[kv.Key] = kv.Value;
                }
                else
                {
                    TransactionLevelOutput.Add(kv.Key, kv.Value);
                }
            }
        }
        private void AddTransactionLevelOutputToInput(IBuilderTransaction trac)
        {
            var tracInput = trac.Input;

            if (tracInput == null)
            {
                return;
            }
            foreach (KeyValuePair <string, object> kv in TransactionLevelOutput)
            {
                if (tracInput.ContainsKey(kv.Key))
                {
                    tracInput[kv.Key] = kv.Value;
                }
                else
                {
                    tracInput.Add(kv.Key, kv.Value);
                }
            }
        }
 private void ExecuteRollBack(int Index)
 {
     for (int index = Index; index >= 0; index--)
     {
         IBuilderTransaction trac = Transactions[index];
         string processname       = trac.GetType().Name;
         _logger.LogInformation("{0} transaction rollback executing", processname);
         try
         {
             AddTransactionLevelOutputToInput(trac);
             trac.RollBack();
             AddOutputToTransactionLevelOutput(trac);
         }
         catch
         {
             _logger.LogError("Rollback failed for process {0}", processname);
             _logger.LogError("Transaction in inconsistant state, manual check required");
             throw;
         }
     }
 }
 public void AddTraction(IBuilderTransaction trac)
 {
     Transactions.Add(trac);
 }