/// <summary>
        /// Registers type <typeparamref name="TConcrete"/> such that a single instance is shared within a Web Api request, or if no Web Api request
        /// is in scope, a transient instance is created. When the Web API request ends and <typeparamref name="TConcrete"/> implements
        /// <see cref="T:System.IDisposable"/>, the cached instance will be disposed.
        /// </summary>
        /// <typeparam name="TConcrete"></typeparam>
        /// <param name="container"></param>
        public static void RegisterWebApiRequestOrTransient <TConcrete>(this Container container)
            where TConcrete : class
        {
            Contract.Requires <ArgumentNullException>(container != null);

            container.Register <TConcrete>(container.PerWebApiRequestOrTransientLifestyle());
        }
        /// <summary>
        /// Registers type <typeparamref name="TImplementation"/> such that a single instance is shared within a Web Api request, or if no Web Api request
        /// is in scope, a transient instance is created. When the Web API request ends and <typeparamref name="TImplementation"/> implements
        /// <see cref="T:System.IDisposable"/>, the cached instance will be disposed.
        /// </summary>
        /// <typeparam name="TService">The interface or base type that can be used to retrieve the instances.</typeparam>
        /// <typeparam name="TImplementation">The concrete type that will be registered.</typeparam>
        /// <param name="container">The container to make the registrations in.</param>
        /// <exception cref="T:System.ArgumentNullException">Thrown when the <paramref name="container"/> is a null reference.</exception>
        /// <exception cref="T:System.InvalidOperationException">Thrown when this container instance is locked and can not be altered, or when an
        /// <typeparamref name="TService"/> has already been registered.</exception>
        /// <exception cref="T:System.ArgumentException">Thrown when the given <typeparamref name="TImplementation"/> type is not
        /// a type that can be created by the container.</exception>
        public static void RegisterWebApiRequestOrTransient <TService, TImplementation>(this Container container)
            where TService : class
            where TImplementation : class, TService
        {
            Contract.Requires <ArgumentNullException>(container != null);

            container.Register <TService, TImplementation>(container.PerWebApiRequestOrTransientLifestyle());
        }
        /// <summary>
        /// Registers the specified delegate to return instances of type <typeparamref name="TService"/>.  The instance is shared within a Web Api request, or if no Web Api request is in scope, a transient instance is created. When the Web API request ends and the object implements
        /// <see cref="T:System.IDisposable"/>, the cached instance will be disposed.
        /// </summary>
        /// <typeparam name="TService">The interface or base type that can be used to retrieve instances.</typeparam>
        /// <param name="container">The container to make the registrations in.</param>
        /// <param name="instanceCreator">The delegate that allows building or creating new instances.</param>
        /// <exception cref="T:System.ArgumentNullException">Thrown when either the <paramref name="container"/>, or <paramref name="instanceCreator"/> are null references.</exception>
        /// <exception cref="T:System.InvalidOperationException">Thrown when this container instance is locked and can not be altered, or when the <typeparamref name="TService"/> has already been registered.</exception>
        public static void RegisterWebApiRequestOrTransient <TService>(this Container container, Func <TService> instanceCreator)
            where TService : class
        {
            Contract.Requires <ArgumentNullException>(container != null);
            Contract.Requires <ArgumentNullException>(instanceCreator != null);

            container.Register <TService>(instanceCreator, container.PerWebApiRequestOrTransientLifestyle());
        }