指定.Net配置文件的位置
我正在尝试使用.Net配置模型来处理加载和合并配置文件的能力,类似于如何将Hierachical ASP.Net web配置文件合并在一起 感谢这一系列优秀的文章,我已经了解了如何做大多数事情,但是在指定要加载的配置文件的确切继承人时遇到了一些问题。与web.config文件一样,要加载的配置文件可能有无限的继承权,需要在运行时确定关于应该包含哪些文件的规则 作为我所说的继承人身份的一个例子,如果用户正在处理文件“c:\user\jblogs\Documents\Projects\MyApp\AppFile12.txt”,那么我可能希望在继承人身份中包含以下文件:指定.Net配置文件的位置,.net,configuration,.net,Configuration,我正在尝试使用.Net配置模型来处理加载和合并配置文件的能力,类似于如何将Hierachical ASP.Net web配置文件合并在一起 感谢这一系列优秀的文章,我已经了解了如何做大多数事情,但是在指定要加载的配置文件的确切继承人时遇到了一些问题。与web.config文件一样,要加载的配置文件可能有无限的继承权,需要在运行时确定关于应该包含哪些文件的规则 作为我所说的继承人身份的一个例子,如果用户正在处理文件“c:\user\jblogs\Documents\Projects\MyApp\A
- c:\User\jblogs\Documents\Projects\MyApp\MyApp.config
- c:\User\jblogs\Documents\Projects\myapp.config
- c:\User\jblogs\myapp.config
- c:\ProgramFiles\MyApp\config\MyApp.config
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;
}
}
现在,当您需要应用多个级别的配置时,只需将所有要处理的文件从文件所在的目录收集到一个堆栈中,然后通过弹出堆栈按后进先出顺序处理它们
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 );
}
var currentWorkingDirectory=Path.GetDirectoryName(“c:\\User\\jblogs\\Documents\\Projects\\MyApp\\AppFile12.txt”);
var currentDirectory=新目录信息(currentWorkingDirectory)
var userDataRootDirectory=newdirectoryinfo(“c:\\User\\jblogs\\”;
var configFilesToProcess=新堆栈();
做
{
//在currentDirectory中搜索myapp.config
//如果找到,将路径推送到configFilesToProcess上
currentDirectory=currentDirectory.GetParent();
}
而(!currentDirectory.Equals(userDataRootDirectory)
var applicationConfigPath=“c:\\Program Files\\MyApp\\config\\MyApp.config”;
configFilesToProcess.Push(applicationConfigPath);
var configHandler=new MyConfigHandler();
对象配置=空;
object configContext=null;//不知道这是什么,但我认为这是整个配置文件
while(configFilesToProcess.Any())
{
var configPath=configFilesToProcess.Pop();
//加载配置文件
var configNode=null;//使用xpath提取配置节点
configuration=configHandler.Create(配置、configContext、configNode);
}
请注意,上面显示的代码并不是最漂亮的,但它显示了它的意图——我建议将其拆分为多个单独的、命名良好的方法,每个方法只做一件事,而且做得很好=)