我有2个项目共享一些appSettinsg和config部分。让我们说:
现在在每个app.config中,我想指向第三个共享的.config文件,其中包含一些常见的appSettings和配置部分,由ProjectA和B使用。
我知道我可以使用configSource属性来引用每个configSection的外部文件,但是,从实验来看,这种方法每个外部文件只能保存一个配置部分(通过定义config部分定义为其根目录)元件)。为方便起见,我希望“普通”文件能容纳多个文件。
这可能吗?
答案 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);
}
}