2012-09-12 3 views
7

In einer .NET-Anwendung, wenn Sie bestimmen Einstellungen haben müssen, wie sie in DB speichern, dann Sie LocalFileSettingsProvider mit einer benutzerdefinierten Einstellung Provider Ihre Beispiele ersetzen könnten:SettingsProviderAttribute Ersatz für Anwendungsebene individueller Settings

Create a Custom Settings Provider to Share Settings Between Applications

Creating a Custom Settings Provider

um die Einstellungen Klasse zu deklarieren (derjenige, der ApplicationSettingsBase erbt), die Sie einen bestimmten Anbieter verwenden möchten, können Sie es mit SettingsProviderAttribute dekorieren und Ihren Provider-Typ als para geben Meter [SettingsProvider(typeof(MyCustomProvider))], andernfalls wird der Standardwert LocalFileSettingsProvider verwendet.

Meine Frage: Gibt es eine Konfiguration oder einen Trick, den ich verwenden könnte, um meine Anwendung zu zwingen, meinen benutzerdefinierten Anbieter durch die Anwendung zu verwenden, ohne ein Attribut zu verwenden?

Der Grund ist, dass ich Plugins über MEF lade und die Plugins möglicherweise über Drittanbieter geschrieben werden und ich möchte nicht, dass sie sich damit befassen, wie Einstellungen gehandhabt werden.

Antwort

5

Sie könnten den folgenden Code versuchen. Bei der Erstellung des Einstellungsobjekts ändert sich der Standardanbieter im Prinzip in einen beliebigen anderen Anbieter. Beachten Sie, dass ich diesen Code nie getestet habe.

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

das funktioniert, aber eine Zeile muss aktualisiert werden -> Provider = Provider [Provider .Name] als ArbitrarySettingsProvider; –