SettingsProvider Замена атрибута для пользовательских настроек уровня приложения

В приложении.NET, если у вас есть конкретные настройки, такие как сохранение их в БД, вы можете заменить LocalFileSettingsProvider с вашим поставщиком пользовательских настроек, примеры:

Создание провайдера пользовательских настроек для обмена настройками между приложениями

Создание провайдера пользовательских настроек

Чтобы объявить класс настроек (тот, который наследует ApplicationSettingsBase) что вы хотите использовать конкретный провайдер, вы украшаете его SettingsProviderAttribute и передайте тип вашего провайдера в качестве параметра [SettingsProvider(typeof(MyCustomProvider))]в противном случае будет использоваться значение по умолчанию LocalFileSettingsProvider,

Мой вопрос: есть ли какая-либо конфигурация или хитрость, которую я мог бы использовать, чтобы заставить мое приложение использовать мой пользовательский провайдер через приложение без использования атрибута?

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

1 ответ

Решение

Вы можете попробовать следующий код. Он в основном меняет поставщика по умолчанию на произвольного при создании объекта Settings. Обратите внимание, что я никогда не проверял этот код.

internal sealed partial class Settings {

    public Settings() {

        SettingsProvider provider = CreateAnArbitraryProviderHere();

        // Try to re-use an existing provider, since we cannot have multiple providers
        // with same name.
        if (Providers[provider.Name] == null)
            Providers.Add(provider);
         else
            provider = Providers[provider.Name];

        // Change default provider.
        foreach (SettingsProperty property in Properties)
        {
            if (
                property.PropertyType.GetCustomAttributes(
                    typeof(SettingsProviderAttribute),
                    false
                ).Length == 0
             )
             {
                 property.Provider = provider;
             }
         }
     }
}
Другие вопросы по тегам