从单独的配置文件中读取设置

时间:2010-02-09 19:48:52

标签: asp.net configuration-files

我的asp.net应用程序使用web.config进行常见配置。我还有一个部分将一些数据对象映射到连接字符串,该部分将成千上万行。我想将该部分移动到另一个配置文件“dataMappings.config”,所以我不会批量添加web.config - 是否有访问该配置文件的标准机制?

谢谢你, 安德烈

2 个答案:

答案 0 :(得分:11)

在每个部分中,您可以定义configSource,它可以指向外部文件路径。这是一个简单的例子:

<connectionStrings configSource="myConnectionStrings.Config" />
<appSettings configSource="myAppSettings.Config" />

请确保不要使用.xml文件扩展名,因为可以在浏览器中查看。 .config提供服务。

因为您的配置部分仍然在web.config中定义(因此指向外部文件),您可以通过正常路线(WebConfigurationManager.AppSettingsWebConfigurationManager.GetSectionConfigurationManager访问此信息,或根据需要定制部分处理程序)

答案 1 :(得分:2)

我在共享DLL中使用了配置帮助程序,并在DLL中使用了一个app.config文件,该文件通过编辑项目和设置设置选项卡来使用Settings.Properties.Default。除非您重新编译,并且使用项目设置重新同步app.config(在dll中),否则看起来不会读取值。

这对我有用。我不记得我从哪里获得灵感。我只是将这个类包含在某个共享项目中。允许任何DLL调用自己的设置,这允许您更改dllFile.dll.config条目。我用它来连接字符串。需要注意的是,在此方法中,连接字符串必须是类型字符串,而不是特殊连接字符串。

using System;
using System.Configuration;

namespace Shared
{
    public static class ConfigurationHelper
    {
        public static string GetConfigValue(string keyName)
        {
            string codebase = System.Reflection.Assembly.GetCallingAssembly().CodeBase;  
            Uri p = new Uri(codebase);
            string localPath = p.LocalPath.ToLowerInvariant();
            string executingFilename = System.IO.Path.GetFileNameWithoutExtension(localPath);
            string sectionGroupName = "applicationSettings";
            string sectionName = executingFilename + ".Properties.Settings";
            string configName = localPath + ".config";
            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = configName;
            Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            ConfigurationSectionGroup group = config.GetSectionGroup(sectionGroupName);
            ClientSettingsSection section = null;
            foreach (ClientSettingsSection sect in group.Sections)
            {
                if (sect.SectionInformation.Name.Equals(sectionName, StringComparison.InvariantCultureIgnoreCase))
                {
                    section = sect;
                    break;
                }
            }
            SettingElement elem = section.Settings.Get(keyName);
            if (elem == null)
                return "";
            else
                return elem.Value.ValueXml.InnerText.Trim();
        }
    }
}

//in DLL
void foo()
{
    var str = ConfigurationHelper.GetSetting("ConnectionStringProd");
}