Могу ли я поделиться некоторыми разделами конфигурации в одном общем файле app.config? .сеть - PullRequest
1 голос
/ 10 июня 2010

У меня есть 2 проекта, которые используют некоторые разделы appSettinsg и config. Допустим,

  • ProjectA имеет собственный app.config, содержащий уникальные разделы настроек / конфигурации.
  • ProjectB то же самое ...

Теперь в каждом файле app.config я хочу указать на третий общий файл .config, который содержит некоторые общие разделы appSettings и config, используемые как ProjectA, так и B.

Я знаю, что есть свойство configSource, которое я могу использовать для ссылки на внешний файл для каждого configSection, однако из эксперимента этот подход может содержать только ОДИН раздел конфигурации для каждого внешнего файла (путем определения раздела config определяется как его корневой каталог). элемент). Я бы хотел, чтобы «общий» файл содержал более одного файла для удобства.

Возможно ли это?

1 Ответ

1 голос
/ 10 июня 2010

Вы можете сгруппировать все ваши настройки в свой собственный раздел конфигурации.Затем, конечно, вы можете переместить все это вместе в другой файл, используя атрибут configSource, который вы упомянули выше.

В случае AppSettings ваш пользовательский раздел конфигурации может объединить свои собственные значения с обычными AppSettings (NameValueCollection) с использованием функции Add .Таким образом, вам вообще не нужно менять ваш клиентский код.

В качестве примера, вот мой базовый класс, который я использую, чтобы добавить атрибут "externalConfigSource" к большинству моих пользовательских элементов, чтобы разрешить дальнейший файлрасщепление для некоторых из моих подэлементов (хотя это, возможно, то, что вы пытаетесь избежать):

public class BaseConfigurationElement : ConfigurationElement
{
    protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
    {
        var fileSource = reader.GetAttribute("externalConfigSource");
        if (!String.IsNullOrEmpty(fileSource))
        {
            var file = new FileInfo(Path.Combine(AppDomainExtensions.ConfigurationFilePath(), fileSource));
            if (file.Exists)
            {
                using (var fileReader = file.OpenRead())
                {
                    var settings = new XmlReaderSettings(){ CloseInput = true, IgnoreProcessingInstructions = true, IgnoreWhitespace = true, IgnoreComments = true};
                    using (var fileXmlReader = XmlReader.Create(fileReader, settings))
                    {
                        var atStart = fileXmlReader.IsStartElement();
                        base.DeserializeElement(fileXmlReader, serializeCollectionKey);
                    }
                }
                reader.Skip();
            }
            else
            {
                throw new ConfigurationErrorsException("The file specified in the externalConfigSource attribute cannot be found", reader);
            }
        }
        else
        {
            base.DeserializeElement(reader, serializeCollectionKey);
        }
    }

    protected override bool OnDeserializeUnrecognizedAttribute(string name, string value)
    {
        if (name == "externalConfigSource")
        {
            return true; // Indicate that we do know it...
        }
        return base.OnDeserializeUnrecognizedAttribute(name, value);
    }
}

public static class AppDomainExtensions
{
    public static string ConfigurationFilePath()
    {
        return ConfigurationFilePath(AppDomain.CurrentDomain);
    }

    // /595904/kak-naiti-put-k-aktivnomu-failu-app-config
    public static string ConfigurationFilePath(this AppDomain appDomain)
    {
        return Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...