2010-11-11 114 views
0

我正在嘗試使用.Net配置模型來處理以類似的方式加載和合並一組配置文件的能力,這些配置文件類似於如何構建heirachical ASP.Net網絡配置文件合併在一起。指定.Net配置文件的位置

感謝優秀的Unraveling the Mysteries of .NET 2.0 Configuration系列文章,我已經想出瞭如何做大部分事情,但是我在指定要加載的配置文件的確切流行時遇到了一些麻煩。就像使用web.config文件一樣,可能會有無數的配置文件需要加載,並且需要在運行時確定應該包含哪些文件的規則。我正在談論 - 如果用戶正在處理文件「c:\ User \ jblogs \ Documents \ Projects \ MyApp \ AppFile12.txt」,那麼我可能需要以下內容要被包括在所述heirachy文件:

  • C:\用戶\ jblogs \文件\項目\ MyApp的\ myapp.config
  • C:\用戶\ jblogs \文件\項目\ myapp.config
  • c:\ User \ jblogs \ myapp.config
  • c:\ Program Files \ MyApp \ config \ myapp.config

(免責聲明:以上是我想要實現一個簡單的例子,但我想,如果我能想出如何做上述那麼我就已經破解吧)

我甚至嘗試着在Reflector中查看web.config代碼,但它很難理解到底發生了什麼 - 任何懂得這一點的人都可以將我指向正確的方向嗎?

回答

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); 
} 

請注意,上面顯示的代碼是不是最漂亮的,但它表明了意圖 - 我建議拆分出來爲若干獨立以及命名方法,每做一兩件事,把它做好=)