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" }) { }