我可以在一个常见的app.config文件中共享一些配置部分吗? 。净

时间:2010-06-10 16:54:58

标签: .net app-config

我有2个项目共享一些appSettinsg和config部分。让我们说:

  • ProjectA拥有自己的app.config,其中包含其唯一的设置/配置部分。
  • ProjectB ditto ...

现在在每个app.config中,我想指向第三个共享的.config文件,其中包含一些常见的appSettings和配置部分,由ProjectA和B使用。

我知道我可以使用configSource属性来引用每个configSection的外部文件,但是,从实验来看,这种方法每个外部文件只能保存一个配置部分(通过定义config部分定义为其根目录)元件)。为方便起见,我希望“普通”文件能容纳多个文件。

这可能吗?

1 个答案:

答案 0 :(得分:1)

您可以将所有设置分组到自己的自定义配置部分。当然,您可以使用上面提到的configSource属性将它们一起移动到另一个文件中。

对于AppSettings,您的自定义配置部分可以使用Add功能将其自己的值合并到正常的AppSettings(NameValueCollection)中。这样您根本不需要更改客户端代码。

作为一个方面,这里是我的一些基类,我用来为我的大多数自定义元素添加“externalConfigSource”属性,以允许我的一些子元素进一步分割文件(尽管这可能是你试图避免的):

public class BaseConfigurationElement : ConfigurationElement
{
    protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
    {
        var fileSource = reader.GetAttribute("externalConfigSource");
        if (!String.IsNullOrEmpty(fileSource))
        {
            var file = new FileInfo(Path.Combine(AppDomainExtensions.ConfigurationFilePath(), fileSource));
            if (file.Exists)
            {
                using (var fileReader = file.OpenRead())
                {
                    var settings = new XmlReaderSettings(){ CloseInput = true, IgnoreProcessingInstructions = true, IgnoreWhitespace = true, IgnoreComments = true};
                    using (var fileXmlReader = XmlReader.Create(fileReader, settings))
                    {
                        var atStart = fileXmlReader.IsStartElement();
                        base.DeserializeElement(fileXmlReader, serializeCollectionKey);
                    }
                }
                reader.Skip();
            }
            else
            {
                throw new ConfigurationErrorsException("The file specified in the externalConfigSource attribute cannot be found", reader);
            }
        }
        else
        {
            base.DeserializeElement(reader, serializeCollectionKey);
        }
    }

    protected override bool OnDeserializeUnrecognizedAttribute(string name, string value)
    {
        if (name == "externalConfigSource")
        {
            return true; // Indicate that we do know it...
        }
        return base.OnDeserializeUnrecognizedAttribute(name, value);
    }
}

public static class AppDomainExtensions
{
    public static string ConfigurationFilePath()
    {
        return ConfigurationFilePath(AppDomain.CurrentDomain);
    }

    // http://stackoverflow.com/questions/793657/how-to-find-path-of-active-app-config-file
    public static string ConfigurationFilePath(this AppDomain appDomain)
    {
        return Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    }
}