2012-09-12 14 views
7

in un'applicazione .NET, se si dispone di impostazioni specifiche necessità, come ad esempio la loro memorizzazione nel DB, allora si potrebbe sostituire LocalFileSettingsProvider con un fornitore di impostazioni personalizzate della vostra, esempi:sostituzione SettingsProviderAttribute per a livello di applicazione SettingsProvider personalizzato

Create a Custom Settings Provider to Share Settings Between Applications

Creating a Custom Settings Provider

per dichiarare la classe di impostazioni (quello che eredita ApplicationSettingsBase) che si desidera utilizzare un provider specifico, si decorano con SettingsProviderAttribute e passare il vostro tipo di provider come para metro [SettingsProvider(typeof(MyCustomProvider))], altrimenti utilizzerà il valore predefinito LocalFileSettingsProvider.

La mia domanda: C'è una configurazione o un trucco che potrei usare per forzare la mia applicazione a utilizzare il mio fornitore personalizzato attraverso l'applicazione senza utilizzare un attributo?

Il motivo è che sto caricando i plug-in via MEF e che i plug-in possono essere scritti tramite terze parti e non voglio che siano interessati a come vengono gestite le impostazioni.

risposta

5

Si potrebbe provare il seguente codice. In pratica cambia il provider predefinito in uno arbitrario durante la costruzione dell'oggetto Impostazioni. Si noti che non ho mai testato questo codice.

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

funziona, ma una riga deve essere aggiornata -> provider = Provider [provider .Name] come ArbitrarySettingsProvider; –