/// <summary>
        /// Uses CreateTypedConfig method to return strongly typed configuration object.
        /// </summary>
        /// <returns>A strongly typed configuration package</returns>
        /// <remarks>
        /// This method will always return the most recent configuration settings without the need to
        /// restart the consuming application.  For best results, call this method often rather than calling once at startup.
        /// </remarks>
        public virtual T GetConfiguration()
        {
            string callingAssemblyName = Assembly.GetCallingAssembly().GetName().Name;
            IConfigProviderFactory configProviderFactory = _configProviderFactory ?? new ConfigProviderFactory(callingAssemblyName);

            IConfigProvider applicationConfigProvider = configProviderFactory.Create(ApplicationComponentName, _applicationValidationMappings);
            ConfigRoot      applicationConfig         = applicationConfigProvider.GetAndValidateConfiguration();

            IConfigProvider environmentConfigProvider = configProviderFactory.Create(EnvironmentComponentName, _environmentValidationMappings);
            ConfigRoot      environmentConfig         = environmentConfigProvider.GetAndValidateConfiguration();

            // In order to keep the config names short and simple, we'll remove application/environment names as prefixes. The consuming application does not need this information.
            var originalApplicationConfigDictionary = applicationConfig.Data.ToDictionary();
            var originalEnvironmentConfigDictionary = environmentConfig.Data.ToDictionary();
            var modifiedApplicationConfigDictionary = originalApplicationConfigDictionary.ToDictionary(originalKey => RemoveComponentPrefix(originalKey.Key, string.Format("{0}.", ApplicationComponentName)), y => y.Value);
            var modifiedEnvironmentConfigDictionary = originalEnvironmentConfigDictionary.ToDictionary(originalKey => RemoveComponentPrefix(originalKey.Key, string.Format("{0}.", EnvironmentComponentName)), y => y.Value);

            return(CreateTypedConfig(modifiedApplicationConfigDictionary, modifiedEnvironmentConfigDictionary));
        }