public static async Task <OperationResult <T> > RunWithTransactionAsync <T>(this ITransactionScopeProvider provider, Func <ITransactionScopeDataAccessor, Task <OperationResult <T> > > callback)
        {
            ITransactionScopeDataAccessor accessor = null;

            try {
                accessor = provider.GetTransactionScopeDataAccessor();

                var operation = await callback(accessor);

                if (operation.WasSuccessful)
                {
                    var commitTransaction = accessor.CommitTransaction();
                    if (commitTransaction.WasSuccessful == false)
                    {
                        return(new OperationResult <T>(commitTransaction.Exceptions));
                    }
                }
                else
                {
                    var rollbackTransaction = accessor.RollbackTransaction();
                    if (rollbackTransaction.WasSuccessful == false)
                    {
                        return(new OperationResult <T>(false, operation.Result, operation.Exceptions.Concat(rollbackTransaction.Exceptions)));
                    }
                }

                return(operation);
            }
            catch (Exception ex) {
                var rollBack =
                    accessor?.RollbackTransaction();

                var exceptions = new List <Exception>();
                exceptions.Add(ex);

                if (rollBack != null)
                {
                    exceptions.AddRange(rollBack.Exceptions);
                }

                return(new OperationResult <T>(exceptions));
            }
        }
 /// <summary>
 /// Instantiates SQLLoggingDataAccessor.
 /// </summary>
 /// <param name="component">The object implementing ITransactionScopeDataAccessor being wrapped.</param>
 /// <param name="logger">The logger to be used.</param>
 public SQLTransactionScopeLoggingDataAccessor(ITransactionScopeDataAccessor component, ILogger logger)
 {
     _component = component;
     _logger    = logger;
 }
 /// <summary>
 /// Instantiates SQLLoggingDataAccessor.
 /// </summary>
 /// <param name="component">The object implementing ITransactionScopeDataAccessor being wrapped.</param>
 /// <param name="fileName">The filename for the log. Will log with timestamp.</param>
 public SQLTransactionScopeLoggingDataAccessor(ITransactionScopeDataAccessor component, string fileName) : this(component, new TimeStampLogger(fileName) { LinePrependageText = "\r\n" })
 {
 }