/// <summary>
        /// Sets the composition container to the ambient services.
        /// </summary>
        /// <param name="ambientServicesBuilder">The ambient services builder.</param>
        /// <param name="containerBuilderConfig">The container builder configuration.</param>
        /// <returns>The provided ambient services builder.</returns>
        public static AmbientServicesBuilder WithMefCompositionContainer(this AmbientServicesBuilder ambientServicesBuilder, Action<MefCompositionContainerBuilder> containerBuilderConfig = null)
        {
            Contract.Requires(ambientServicesBuilder != null);
            
            var containerBuilder = new MefCompositionContainerBuilder(new CompositionContainerBuilderContext(ambientServicesBuilder.AmbientServices));

            containerBuilderConfig?.Invoke(containerBuilder);

            return ambientServicesBuilder.WithCompositionContainer(containerBuilder.CreateContainer());
        }
        /// <summary>
        /// Sets asynchronously the composition container to the ambient services.
        /// </summary>
        /// <param name="ambientServicesBuilder">The ambient services builder.</param>
        /// <param name="containerBuilderConfig">The container builder configuration.</param>
        /// <returns>A promise of the provided ambient services builder.</returns>
        public static async Task<AmbientServicesBuilder> WithMefCompositionContainerAsync(this AmbientServicesBuilder ambientServicesBuilder, Action<MefCompositionContainerBuilder> containerBuilderConfig = null)
        {
            Contract.Requires(ambientServicesBuilder != null);

            var containerBuilder = new MefCompositionContainerBuilder(new CompositionContainerBuilderContext(ambientServicesBuilder.AmbientServices));

            containerBuilderConfig?.Invoke(containerBuilder);

            var container = await containerBuilder.CreateContainerAsync().PreserveThreadContext();
            return ambientServicesBuilder.WithCompositionContainer(container);
        }
        /// <summary>
        /// Sets the composition container to the ambient services.
        /// </summary>
        /// <param name="ambientServicesBuilder">The ambient services builder.</param>
        /// <param name="containerBuilderConfig">The container builder configuration.</param>
        /// <returns>The provided ambient services builder.</returns>
        public static AmbientServicesBuilder WithMefCompositionContainer(this AmbientServicesBuilder ambientServicesBuilder, Action<MefCompositionContainerBuilder> containerBuilderConfig)
        {
            Contract.Requires(ambientServicesBuilder != null);
            Contract.Requires(containerBuilderConfig != null);

            var containerBuilder = new MefCompositionContainerBuilder(
                ambientServicesBuilder.AmbientServices.LogManager,
                ambientServicesBuilder.AmbientServices.ConfigurationManager,
                ambientServicesBuilder.AmbientServices.PlatformManager);

            containerBuilderConfig(containerBuilder);

            return ambientServicesBuilder.WithCompositionContainer(containerBuilder.CreateContainer());
        }
        /// <summary>
        /// Sets asynchronously the composition container to the ambient services.
        /// </summary>
        /// <param name="ambientServicesBuilder">The ambient services builder.</param>
        /// <param name="containerBuilderConfig">The container builder configuration.</param>
        /// <returns>The provided ambient services builder.</returns>
        public static async Task<AmbientServicesBuilder> WithMefCompositionContainerAsync(this AmbientServicesBuilder ambientServicesBuilder, Action<MefCompositionContainerBuilder> containerBuilderConfig = null)
        {
            Contract.Requires(ambientServicesBuilder != null);

            var containerBuilder = new MefCompositionContainerBuilder(
                ambientServicesBuilder.AmbientServices.LogManager,
                ambientServicesBuilder.AmbientServices.ConfigurationManager,
                ambientServicesBuilder.AmbientServices.PlatformManager);

            if (containerBuilderConfig != null)
            {
                containerBuilderConfig(containerBuilder);
            }

            return ambientServicesBuilder.WithCompositionContainer(await containerBuilder.CreateContainerAsync());
        }