2012-09-12 10 views
7

En una aplicación .NET, si tiene la configuración específica necesitan, como su almacenamiento en base de datos, entonces se podría sustituir LocalFileSettingsProvider con un proveedor de configuración personalizada de su, ejemplos:reemplazo para SettingsProviderAttribute a nivel de aplicación personalizada SettingsProvider

Create a Custom Settings Provider to Share Settings Between Applications

Creating a Custom Settings Provider

declarar la clase configuración (el que hereda ApplicationSettingsBase) que desea utilizar un proveedor específico, se decora con SettingsProviderAttribute y aprobar el tipo de proveedor como un párrafo [SettingsProvider(typeof(MyCustomProvider))], de lo contrario utilizará el valor predeterminado LocalFileSettingsProvider.

Mi pregunta es: ¿Hay alguna configuración o truco que pueda usar para forzar a mi aplicación a usar mi proveedor personalizado en toda la aplicación sin usar un atributo?

La razón es que estoy cargando complementos a través de MEF y los complementos pueden escribirse a través de terceros y no quiero que se preocupen por cómo se manejan las configuraciones.

Respuesta

5

Puede probar el siguiente código. Básicamente, cambia el proveedor predeterminado a uno arbitrario durante la construcción del objeto Configuración. Tenga en cuenta que nunca probé este código.

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; 
      } 
     } 
    } 
} 
+0

esto funciona, pero hay que actualizar una línea -> provider = Providers [provider .Name] como ArbitrarySettingsProvider; –

Cuestiones relacionadas