/// <summary> /// Enlists a <see cref="UnitOfWorkScope"/> instance with the transaction manager, /// with the specified transaction mode. /// </summary> /// <param name="scope">The <see cref="IUnitOfWorkScope"/> to register.</param> /// <param name="mode">A <see cref="TransactionMode"/> enum specifying the transaciton /// mode of the unit of work.</param> public void EnlistScope(IUnitOfWorkScope scope, TransactionMode mode) { _logger.Info(string.Format("Enlisting scope {0} with transaction manager {1} with transaction mode {2}", scope.ScopeId, _transactionManagerId, mode)); var uowFactory = ServiceLocator.Current.GetInstance<IUnitOfWorkFactory>(); if (_transactions.Count == 0 || mode == TransactionMode.New || mode == TransactionMode.Supress) { _logger.Debug(string.Format("Enlisting scope {0} with mode {1} requires a new TransactionScope to be created.", scope.ScopeId, mode)); var txScope = TransactionScopeHelper.CreateScope(UnitOfWorkSettings.DefaultIsolation, mode); var unitOfWork = uowFactory.Create(); var transaction = new UnitOfWorkTransaction(unitOfWork, txScope); transaction.TransactionDisposing += OnTransactionDisposing; transaction.EnlistScope(scope); _transactions.AddFirst(transaction); return; } CurrentTransaction.EnlistScope(scope); }
/// <summary> /// Handles a Dispose signal from a transaction. /// </summary> /// <param name="transaction"></param> void OnTransactionDisposing(UnitOfWorkTransaction transaction) { _logger.Info(string.Format("UnitOfWorkTransaction {0} signalled a disposed. Unregistering transaction from TransactionManager {1}", transaction.TransactionId, _transactionManagerId)); transaction.TransactionDisposing -= OnTransactionDisposing; var node = _transactions.Find(transaction); if (node != null) _transactions.Remove(node); }