/// <summary>
        /// Add conversation to the <see cref="ConversationPool"/>
        /// </summary>
        /// <remarks>
        /// if already in the <see cref="ConversationPool"/>, do simply change the SpanStrategy if there is any change
        /// </remarks>
        private bool Span(SpanStrategy om, string inWorkSpaceName, TransactionStrategy ts)
        {
            Visited();
            if (!om.ValidForSpan)
            {
                throw new ArgumentException(om + "is not an accetable overspan strategy for spanning");
            }
            if (GivenUp)
            {
                throw new ConversationAlreadyCancelledException();
            }

            SpanStrategy = om;
            bool retVal = false;

            if (!IsInPool)
            {
                ConversationPool.Instance.Add(id, this);
                retVal = true;
            }
            if (ts != null)
            {
                TransactionStrategy = ts;
            }
            TransactionStrategy.ChangeFlushModeOnConversationBeginsSpan(sessManagers.Values);

            workSpaceName = inWorkSpaceName;
            WorkSpaceUpdate();
            return(retVal);
        }
        private ISession GetSession(SessionAndTransactionManager sm)
        {
            ISession sess = sm.GetSession();

            TransactionStrategy.OnSessionUsed(sm);
            return(sess);
        }
 private void CommitTransaction()
 {
     if (Options.IsTransactional == true)
     {
         TransactionStrategy.Commit();
     }
 }
 protected override void BeginUow()
 {
     if (Options.IsTransactional == true)
     {
         TransactionStrategy.InitOptions(Options);
     }
 }
        public virtual TDbContext GetOrCreateDbContext <TDbContext>()
            where TDbContext : EfCoreDbContextBase
        {
            var concreteDbContextType = typeof(TDbContext);

            var connectionString = base.ConnectionStringResolver.GetNameOrConnectionString();

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            EfCoreDbContextBase dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                if (Options.IsTransactional == true)
                {
                    dbContext = TransactionStrategy.CreateDbContext <TDbContext>(connectionString, DbContextResolver);
                }
                else
                {
                    dbContext = DbContextResolver.Resolve <TDbContext>(connectionString, null);
                }

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
 /// <summary>
 /// Remove this from the <see cref="ConversationPool"/>
 /// </summary>
 /// <remarks>
 /// if not in the <see cref="ConversationPool"/>, do nothing
 /// </remarks>
 private void StopSpanning()
 {
     if (IsInPool)
     {
         ConversationPool.Instance.Remove(id);
     }
     if (spanStrategy != SpanStrategy.DoNotSpan)             //I use field here because the property alwasy return  SpanStrategy.DoNotSpan when not in pool, the field is more indicative on what the strategy was set as.
     {
         SpanStrategy = SpanStrategy.DoNotSpan;
         TransactionStrategy.ChangeFlushModeOnConversationStopsSpan(sessManagers.Values);
         WorkSpaceUpdate();
     }
 }
 internal void OnWorkSpaceClose()
 {
     if (GivenUp)
     {
         RollbackAndClose();
     }
     else if (!IsInPool)
     {
         CommitAndClose();
     }
     else
     {
         TransactionStrategy.OnWorkSpaceClosedBeforeConversationEnds(sessManagers.Values);
     }
 }
        protected override void DisposeUow()
        {
            if (Options.IsTransactional == true)
            {
                TransactionStrategy.Dispose(IocResolver);
            }
            else
            {
                foreach (var context in GetAllActiveDbContexts())
                {
                    context.Dispose();
                    IocResolver.Release(context);
                }
            }

            ActiveDbContexts.Clear();
        }
Exemple #9
0
 public void Reset()
 {
     TransactionStrategy.Reset();
 }
 public bool SpanWithCookie(string inWorkSpaceName, TransactionStrategy ts)
 {
     return(Span(SpanStrategy.Cookie, inWorkSpaceName, ts));
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="ts">Controls the TransactionStrategy</param>
 /// <returns></returns>
 public bool SpanWithPostBacks(TransactionStrategy ts)
 {
     return(Span(SpanStrategy.Post, string.Empty, ts));
 }
		/// <summary>
		/// Add conversation to the <see cref="ConversationPool"/>
		/// </summary>
		/// <remarks>
		/// if already in the <see cref="ConversationPool"/>, do simply change the SpanStrategy if there is any change
		/// </remarks>
		private bool Span(SpanStrategy om, string inWorkSpaceName, TransactionStrategy ts)
		{
			Visited();
			if (!om.ValidForSpan)
			{
				throw new ArgumentException(om + "is not an accetable overspan strategy for spanning");
			}
			if (GivenUp)
			{
				throw new ConversationAlreadyCancelledException();
			}

			SpanStrategy = om;
			bool retVal = false;
			if (!IsInPool)
			{
				ConversationPool.Instance.Add(id, this);
				retVal = true;
			}
			if (ts != null)
				TransactionStrategy = ts;
			TransactionStrategy.ChangeFlushModeOnConversationBeginsSpan(sessManagers.Values);

			workSpaceName = inWorkSpaceName;
			WorkSpaceUpdate();
			return retVal;
		}
		public bool SpanWithCookie(string inWorkSpaceName, TransactionStrategy ts)
		{
			return Span(SpanStrategy.Cookie, inWorkSpaceName, ts);
		}
		/// <summary>
		/// 
		/// </summary>
		/// <param name="ts">Controls the TransactionStrategy</param>
		/// <returns></returns>
		public bool SpanWithPostBacks(TransactionStrategy ts)
		{
			return Span(SpanStrategy.Post, string.Empty, ts);
		}