指定.Net配置文件的位置

指定.Net配置文件的位置,.net,configuration,.net,Configuration,我正在尝试使用.Net配置模型来处理加载和合并配置文件的能力,类似于如何将Hierachical ASP.Net web配置文件合并在一起 感谢这一系列优秀的文章,我已经了解了如何做大多数事情,但是在指定要加载的配置文件的确切继承人时遇到了一些问题。与web.config文件一样,要加载的配置文件可能有无限的继承权,需要在运行时确定关于应该包含哪些文件的规则 作为我所说的继承人身份的一个例子,如果用户正在处理文件“c:\user\jblogs\Documents\Projects\MyApp\A

我正在尝试使用.Net配置模型来处理加载和合并配置文件的能力,类似于如何将Hierachical ASP.Net web配置文件合并在一起

感谢这一系列优秀的文章,我已经了解了如何做大多数事情,但是在指定要加载的配置文件的确切继承人时遇到了一些问题。与web.config文件一样,要加载的配置文件可能有无限的继承权,需要在运行时确定关于应该包含哪些文件的规则

作为我所说的继承人身份的一个例子,如果用户正在处理文件“c:\user\jblogs\Documents\Projects\MyApp\AppFile12.txt”,那么我可能希望在继承人身份中包含以下文件:

  • 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
(免责声明:以上是我想要实现的一个简化示例,但我认为如果我能想出如何实现上述目标,那么我将破解它)

我甚至试过查看Reflector中的web.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);
}
请注意,上面显示的代码并不是最漂亮的,但它显示了它的意图——我建议将其拆分为多个单独的、命名良好的方法,每个方法只做一件事,而且做得很好=)