2010-11-11 4 views
0

Я пытаюсь использовать модель conf confection для .Net, чтобы обрабатывать возможность загрузки и объединения объедени конфигурационных файлов так же, как файлы heirachical ASP.Net web confgiuration объединяются вместе.Задание местоположения файлов конфигурации .Net

Благодаря отличной серии статей Unraveling the Mysteries of .NET 2.0 Configuration я выяснил, как делать большинство вещей, но у меня возникли проблемы с указанием точного heirachy файлов конфигурации, которые нужно загрузить. Как и в файлах web.config, потенциально может быть бесконечная загрузка файлов конфигурации для загрузки, а правила о том, какие именно файлы должны быть включены, должны быть определены во время выполнения.

В качестве примера такого рода heirachy, о котором я говорю, - если пользователь работает над файлом «c: \ User \ jblogs \ Documents \ Projects \ MyApp \ AppFile12.txt», тогда мне может понадобиться следующее файлы, которые будут включены в heirachy:

  • C: \ User \ jblogs \ Documents \ Projects \ MyApp \ myapp.config
  • C: \ User \ jblogs \ Documents \ Projects \ myapp.config
  • c: \ User \ jblogs \ myapp.config
  • c: \ Program Files \ MyApp \ config \ myapp.config

(Отказ от ответственности: Выше упрощенный пример того, что я хочу достичь, но я думаю, что если я могу понять, как сделать выше, то я взломал его)

Я даже попытался взглянуть на код web.config в Reflector, но его сложно понять, что происходит - может ли кто-нибудь, кто это понимает, немного лучше, указывает мне в правильном направлении?

ответ

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

Пожалуйста, обратите внимание, что код, приведенный выше, не является самым симпатичным, но это показывает намерение - я хотел бы предложить разделив его на несколько отдельных хорошо названных методов, каждый сделать одну вещь, и сделать это хорошо =)

Смежные вопросы