none
Работа с app.config в плагинах для основного приложения RRS feed

  • Общие обсуждения

  • Добрый день,

    разрабатываю приложение с большим количеством, подгружаемых через рефлексию, плагинов. Почти у каждого плагина есть свой app.config в котором прописаны разные настройки, в том числе и биндинги для веб-сервисов.

    Так как плагин подгружается динамически, то в основном приложении, ConfigurationManager не видит секций из app.config плагинов, так же как и экземпляр WCF сервиса не видит своих биндингов.

    Может кто-нибудь подскажет, как подгрузить секции из конфигов плагинов в конфиг основного приложения?

    Сейчас, я смотрю в сторону: ConfigurationManager.OpenExeConfiguration и динамическом заполнении(или обновлении) коллекций SectionGroups и Sections из конфига основного приложения, но при заполнении данных, столкнулся с проблемой, ConfiguredBindings это readonly коллекция и я ее не могу дополнить или обновить. Пробую так (пока только для биндингов):

            private static void UpdateGeneralConfigByPluginConfig(string pathToLibrary, string appName, Configuration mainAssembly)
            {
                var pluginConfiguration = ConfigurationManager.OpenExeConfiguration(pathToLibrary);
                foreach (ConfigurationSectionGroup sectionGroup in pluginConfiguration.SectionGroups)
                {
                    foreach (ConfigurationSection section in sectionGroup.Sections)
                    {
                        if (section is BindingsSection)
                        {
                            UpdateBindingSection(
                                section as BindingsSection,
                                appName,
                                mainAssembly.SectionGroups[sectionGroup.Name]
                                            .Sections[section.SectionInformation.Name] as BindingsSection);
                        }
                        else {/*...*}
                        }
                    }
                }
            }

    private static void UpdateBindingSection( BindingsSection pluginBindingSection, BindingsSection mainAssemblyBindingSection) {

    /*1*/

    BindingCollectionElement difference = pluginBindingSection.BindingCollections.Except(mainAssemblyBindingSection.BindingCollections).First(); foreach (var bindingConfigurationElement in difference.ConfiguredBindings) { foreach (var bindingCollectionElement in mainAssemblyBindingSection.BindingCollections) { if (bindingCollectionElement.BindingName == difference.BindingName && bindingCollectionElement.BindingType == difference.BindingType) { bindingCollectionElement.ConfiguredBindings.ToList().Add(bindingConfigurationElement); } } } }

    В точке 1 нашлось значение из конфига плагина, теперь нужно его вставить в конфиг основного приложения. Но Readonly коллекция не содержит методов Add, а вариант с .ToList() не сработал:)

    Есть какой-то вариант обновить ее значения(без рефлекции)? и может кто-то предложит более удачное решение?

    Заранее спасибо.



    5 октября 2015 г. 16:16