/// <summary>
        /// Attempts to add an object with per thread lifetime for the specified key
        /// </summary>
        /// <typeparam name="TSrc">The type that will be used as a key</typeparam>
        /// <param name="obj">Association container to which the addition is performed</param>
        /// <param name="objType">The type of the object that will be held by the PerThread lifetime container</param>
        /// <returns>True if the association was added successfully (that is AssociationContainer did not contained lifetime container with the same key); overwise false</returns>
        public static bool TryAddPerThread <TSrc>(this IPerThreadAssociationSupport <Type> obj, Type objType)
        {
            Contract.Requires(obj != null);
            Contract.Requires <ArgumentNullException>(objType != null);

            return(obj.TryAddPerThread(typeof(TSrc), objType));
        }
        /// <summary>
        /// Attempts to add an object with per thread lifetime for the specified key
        /// </summary>
        /// <typeparam name="TSrc">The type that will be used as a key</typeparam>
        /// <param name="obj">Association container to which the addition is performed</param>
        /// <param name="objType">The type of the object that will be held by the PerThread lifetime container</param>
        /// <returns>True if the association was added successfully (that is AssociationContainer did not contained lifetime container with the same key); overwise false</returns>
        public static bool TryAddPerThread <TSrc>(this IPerThreadAssociationSupport <Type> obj, Type objType)
        {
            TurboContract.Requires(obj != null, conditionString: "obj != null");
            TurboContract.Requires(objType != null, conditionString: "objType != null");

            return(obj.TryAddPerThread(typeof(TSrc), objType));
        }
        /// <summary>
        /// Adds an object with per thread lifetime for the specified key
        /// </summary>
        /// <typeparam name="TSrc">The type that will be used as a key</typeparam>
        /// <typeparam name="TTarg">The type of the object that will be held by the PerThread lifetime container</typeparam>
        /// <param name="obj">Association container to which the addition is performed</param>
        public static void AddPerThread <TSrc, TTarg>(this IPerThreadAssociationSupport <Type> obj)
        {
            Contract.Requires(obj != null);

            obj.AddPerThread(typeof(TSrc), typeof(TTarg));
        }
        /// <summary>
        /// Attempts to add an object with per thread lifetime for the specified key
        /// </summary>
        /// <typeparam name="TSrc">The type that will be used as a key</typeparam>
        /// <typeparam name="TTarg">The type of the object that will be held by the PerThread lifetime container</typeparam>
        /// <param name="obj">Association container to which the addition is performed</param>
        /// <returns>True if the association was added successfully (that is AssociationContainer did not contained lifetime container with the same key); overwise false</returns>
        public static bool TryAddPerThread <TSrc, TTarg>(this IPerThreadAssociationSupport <Type> obj)
        {
            Contract.Requires(obj != null);

            return(obj.TryAddPerThread(typeof(TSrc), typeof(TTarg)));
        }
        /// <summary>
        /// Adds an object with per thread lifetime for the specified key
        /// </summary>
        /// <typeparam name="TSrc">The type that will be used as a key</typeparam>
        /// <typeparam name="TTarg">The type of the object that will be held by the PerThread lifetime container</typeparam>
        /// <param name="obj">Association container to which the addition is performed</param>
        public static void AddPerThread <TSrc, TTarg>(this IPerThreadAssociationSupport <Type> obj)
        {
            TurboContract.Requires(obj != null, conditionString: "obj != null");

            obj.AddPerThread(typeof(TSrc), typeof(TTarg));
        }