我正在尝试使用.Net配置模型来处理加载和合并配置文件的能力,其方式与将流行的ASP.Net Web配置文件合并在一起的方式类似。
感谢优秀的Unraveling the Mysteries of .NET 2.0 Configuration系列文章,我已经弄清楚如何做大多数事情,但是我在指定要加载的配置文件的确切长度方面遇到了一些麻烦。与web.config文件一样,可能会加载无限的配置文件,并且需要在运行时确定应该包含哪些文件的规则。
作为我正在谈论的那种heirachy的一个例子 - 如果用户正在处理文件“c:\ User \ jblogs \ Documents \ Projects \ MyApp \ AppFile12.txt”那么我可能想要以下文件被包含在heirachy中:
(免责声明:以上是我想要实现的一个简化示例,但我认为如果我能弄清楚如何做到这一点,那么我会破解它)
我甚至试过在Reflector中查看web.config代码,但是要明白究竟发生了什么是很棘手的 - 任何能够理解这一点的人都能指出我在正确的方向吗?
答案 0 :(得分:0)
public class MyConfigObject
{
public class MyConfigObject( MyConfigObject parent )
{
// Copy constructor - don't alter the parent.
}
}
public class MyConfigHandler : IConfigurationSectionHandler
{
public object Create( object parent, object context, XmlNode section )
{
var config = new MyConfigObject( (MyConfigObject)parent );
// Process section and mutate config as required
return config;
}
}
现在,当您需要应用多个级别的配置时,只需收集要在文件所在目录中处理的堆栈中处理的所有文件,然后通过弹出堆栈以LIFO顺序处理它们。
var currentWorkingDirectory = Path.GetDirectoryName( "c:\\User\\jblogs\\Documents\\Projects\\MyApp\\AppFile12.txt" );
var currentDirectory = new DirectoryInfo( currentWorkingDirectory )
var userDataRootDirectory = new DirectoryInfo( "c:\\User\\jblogs\\" );
var configFilesToProcess = new Stack<string>();
do
{
// Search for myapp.config in currentDirectory
// If found push path onto configFilesToProcess
currentDirectory = currentDirectory.GetParent();
}
while( !currentDirectory.Equals( userDataRootDirectory )
var applicationConfigPath = "c:\\Program Files\\MyApp\\config\\myapp.config";
configFilesToProcess.Push( applicationConfigPath );
var configHandler = new MyConfigHandler();
object configuration = null;
object configContext = null; // no idea what this is but i think it is the entire config file
while( configFilesToProcess.Any() )
{
var configPath = configFilesToProcess.Pop();
// Load config file
var configNode = null; // Extract your config node using xpath
configuration = configHandler.Create( configuration, configContext, configNode );
}
请注意,上面显示的代码并不是最漂亮的,但它显示了意图 - 我建议将其拆分为多个单独的名称明确的方法,每个方法都做一件事并做得很好=)