Example #1
0
        protected virtual object CloseUnitOfWork(TransactionAttributeSettings transactionAttributeSettings,
                                                 object transactionState, Exception err)
        {
            string factoryKey = transactionAttributeSettings.FactoryKey;

            if (err == null)
            {
                try {
                    NHibernateSession.CurrentFor(factoryKey).Flush();
                    transactionState = transactionManager.CommitTransaction(factoryKey, transactionState);
                }
                catch (Exception) {
                    transactionState = transactionManager.RollbackTransaction(factoryKey, transactionState);
                    transactionState = transactionManager.PopTransaction(factoryKey, transactionState);
                    throw;
                }
            }
            else
            {
                transactionState = transactionManager.RollbackTransaction(factoryKey, transactionState);
            }
            transactionState = transactionManager.PopTransaction(factoryKey, transactionState);

            return(transactionState);
        }
Example #2
0
        public void Intercept(IInvocation invocation)
        {
            MethodInfo methodInfo = invocation.MethodInvocationTarget;

            if (methodInfo == null)
            {
                methodInfo = invocation.Method;
            }

            //we take the settings from the first attribute we find searching method first
            //If there is at least one attribute, the call gets wrapped with a transaction
            Type attributeType   = GetAttributeType();
            var  classAttributes =
                (ITransactionAttributeSettings[])
                methodInfo.ReflectedType.GetCustomAttributes(attributeType, false);
            var methodAttributes =
                (ITransactionAttributeSettings[])
                methodInfo.GetCustomAttributes(attributeType, false);

            if (classAttributes.Length == 0 && methodAttributes.Length == 0)
            {
                invocation.Proceed();
            }
            else
            {
                TransactionAttributeSettings transactionAttributeSettings =
                    GetTransactionAttributeSettings(methodAttributes, classAttributes);

                object transactionState = OnEntry(transactionAttributeSettings, null);
                try {
                    invocation.Proceed();
                }
                catch (Exception err) {
                    CloseUnitOfWork(transactionAttributeSettings, transactionState, err);
                    if (!(err is AbortTransactionException))
                    {
                        exceptionLogger.LogException(err, transactionAttributeSettings.IsExceptionSilent,
                                                     methodInfo.ReflectedType);
                    }
                    if (transactionManager.TransactionDepth == 0 &&
                        (transactionAttributeSettings.IsExceptionSilent || err is AbortTransactionException))
                    {
                        invocation.ReturnValue = transactionAttributeSettings.ReturnValue;
                        return;
                    }
                    throw;
                }
                transactionState = OnSuccess(transactionAttributeSettings, transactionState);
            }
        }
Example #3
0
        private TransactionAttributeSettings GetTransactionAttributeSettings(
            ITransactionAttributeSettings[] methodAttributes, ITransactionAttributeSettings[] classAttributes)
        {
            var transactionAttributeSettings = new TransactionAttributeSettings();

            if (methodAttributes.Length > 0)
            {
                transactionAttributeSettings = methodAttributes[methodAttributes.Length - 1].Settings;
            }
            else if (classAttributes.Length > 0)
            {
                transactionAttributeSettings = classAttributes[classAttributes.Length - 1].Settings;
            }
            return(transactionAttributeSettings);
        }
Example #4
0
        protected override object CloseUnitOfWork(TransactionAttributeSettings transactionAttributeSettings,
                                                  object transactionState, Exception err)
        {
            transactionState = base.CloseUnitOfWork(transactionAttributeSettings, transactionState, err);
            if (transactionManager.TransactionDepth == 0)
            {
                var sessionStorage = (NHibernateSession.Storage as IUnitOfWorkSessionStorage);
                if (sessionStorage != null)
                {
                    sessionStorage.EndUnitOfWork(
                        ((UnitOfWorkAttributeSettings)transactionAttributeSettings).CloseSessions);
                }
            }

            return(transactionState);
        }
Example #5
0
 private object OnEntry(TransactionAttributeSettings transactionAttributeSettings, object transactionState)
 {
     return(transactionManager.PushTransaction(transactionAttributeSettings.FactoryKey, transactionState));
 }
Example #6
0
 private object OnSuccess(TransactionAttributeSettings transactionAttributeSettings, object transactionState)
 {
     return(CloseUnitOfWork(transactionAttributeSettings, transactionState, null));
 }
Example #7
0
 public TransactionAttribute()
 {
     this.attributeSettings = new TransactionAttributeSettings();
 }
Example #8
0
 public UnitOfWorkAttribute()
 {
     this.settings = new UnitOfWorkAttributeSettings();
 }