/// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public override T GetConfig <T>()
        {
            DotNetConfigFileAttribute attribute = AttributeHelper.GetConfigAttribute <DotNetConfigFileAttribute>(typeof(T));

            if (attribute == null)
            {
                ConfigThrowHelper.ThrowConfigException(
                    R.ConfigError_NoConfigAttribute, typeof(T).FullName, typeof(DotNetConfigFileAttribute).FullName);
            }

            ConfigSettings           configSettings = FrameworkConfig.GetConfig <ConfigSettings>();
            string                   configFilePath = configSettings.GetConfigFilePath <T>();
            DotNetConfigGetParameter getParameter   = new DotNetConfigGetParameter(configFilePath, attribute.SectionName);

            return(GetConfig <T>(getParameter, attribute.RestartAppDomainOnChange));
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public override T GetConfig <T>()
        {
            ConfigFileAttribute attribute = AttributeHelper.GetConfigAttribute <ConfigFileAttribute>(typeof(T));

            if (attribute == null)
            {
                ConfigThrowHelper.ThrowConfigException(
                    R.ConfigError_NoConfigAttribute, typeof(T).FullName, typeof(ConfigFileAttribute).FullName);
            }

            ConfigSettings configSettings = FrameworkConfig.GetConfig <ConfigSettings>();
            string         configFilePath = string.Empty;

            switch (attribute.ConfigPathType)
            {
            case ConfigPathType.FullPhysicalPath:
            {
                configFilePath = attribute.FileName;
            }
            break;

            case ConfigPathType.ServerPath:
                if (HttpContext.Current == null)
                {
                    configFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, attribute.FileName.Replace("~/", ""));
                    break;
                }
                configFilePath = HttpContext.Current.Server.MapPath(attribute.FileName);
                break;

            default:
            {
                configFilePath = configSettings.GetConfigFilePath <T>();
            }
            break;
            }
            XmlConfigGetParameter getParameter = new XmlConfigGetParameter(configFilePath, attribute.IncludeSubdirectories);

            return(GetConfig <T>(getParameter, attribute.RestartAppDomainOnChange));
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="getParameter"></param>
        /// <param name="restartAppDomainOnChange"></param>
        /// <returns></returns>
        public override T GetConfig <T>(IConfigParameter getParameter, bool restartAppDomainOnChange)
        {
            Check.Argument.IsNotNull("getParameter", getParameter);
            Check.Argument.IsAssignableFrom("getParameter", getParameter, typeof(XmlConfigGetParameter));

            T config = GetConfigFromCache <T>(getParameter);

            if (config == null)
            {
                lock (this.SyncLock)
                {
                    config = GetConfigFromCache <T>(getParameter);
                    if (config == null)
                    {
                        XmlConfigGetParameter cp = getParameter as XmlConfigGetParameter;
                        if (cp.Files.Length > 0)
                        {
                            if (cp.Files.Length == 1)
                            {
                                try
                                {
                                    config = Serializer.XmlSerializer.FromFile <T>(cp.Files[0]);
                                }
                                catch (Exception ex)
                                {
                                    ConfigThrowHelper.ThrowConfigException(ex, R.ConfigFileNotResolved, cp.Files[0], typeof(T).FullName);
                                }
                            }
                            else
                            {
                                try
                                {
                                    FileMergeResult fileMergeResult = XmlUtils.MergeFiles(new List <string>(cp.Files));
                                    if (!fileMergeResult.AllFilesMerged)
                                    {
                                        //Logger.Warning("Framework.Configuration", "XMLConfigProvider", fileMergeResult.ToString());
                                    }

                                    if (fileMergeResult.HasFileMerged)
                                    {
                                        config = Serializer.XmlSerializer.FromSerializedString <T>(fileMergeResult.FileContentMerged);
                                    }
                                    else
                                    {
                                        //Logger.Error("Framework.Configuration", "XMLConfigProvider", fileMergeResult.ToString());
                                    }
                                }
                                catch (Exception ex)
                                {
                                    ConfigThrowHelper.ThrowConfigException(ex, R.ConfigFileNotResolved, cp.FilePaths, typeof(T).FullName);
                                }
                            }

                            AddConfigToCache(getParameter, config);
                            SetupWacher(new XmlConfigChangeWatcher(cp));
                        }
                    }
                }
            }

            return(config);
        }