2010-10-19 8 views

risposta

7

Basta usare il sistema di configurazione .NET integrato! Cosa c'è che non va??

Per questo, aggiungere un riferimento a System.Configuration al progetto e osservare la classe ConfigurationManager in tale spazio dei nomi.

A partire da Visual Studio 2005, è anche possibile definire application- o utenti con ambito impostazioni in un visual designer all'interno VS - assegno out Application Settings Overview su MSDN per questo (quelli funzionano per Winforms e console apps). Tali impostazioni sono memorizzate nello app.config/web.config per le impostazioni con ambito applicativo e in un file user.config separato in una directory accessibile per l'account utente per le impostazioni con ambito utente. Questi possono essere manipolati e aggiornati in fase di esecuzione utilizzando classi .NET standard (dallo spazio dei nomi System.Configuration).

+1

concordato. Perché le persone devono reinventare la ruota? – RPM1984

+0

Posso aggiornare le impostazioni in seguito? – Jichao

+1

@Jiacho: puoi ** sempre ** modificare il file * .config, ovviamente. Inoltre: Visual Studio ha un nodo "Impostazioni" nei suoi progetti - anche quelli sono memorizzati nel sistema di configurazione .NET e puoi avere impostazioni a livello di applicazione e impostazioni specifiche dell'utente, che possono essere aggiornate in fase di runtime, nessun problema –

1

Mentre concordo sul fatto che "re-inventare la ruota" non è una buona idea, la classe .NET System.Configuration è abominevolmente difficile da utilizzare per un compito così semplice.

Avevo bisogno di creare file di configurazione separati che potessero essere specificati sulla riga di comando per uno dei miei programmi (invece del solo default supponendo che fosse "app.config") così ho usato questa semplice classe - che si salva in un file XML.

http://www.dot-dash-dot.com/files/UIsettings.vb

+0

L'unica cosa che è difficile nell'usare gli strumenti delle impostazioni incorporate è quando si vuole fare qualcosa che non supportano out-of-box e quindi bisogna capire come funzionano. Fino a quel momento, è difficile immaginare come un sistema di impostazioni potrebbe essere più semplice. –

0

Ecco un semplice piccolo frammento per iniziare. Non è necessario conoscere alcun xml ...

internal static string GetConfigSetting(string settingName) 
    { 
     return ConfigurationManager.AppSettings[settingName].ToString(); 
    } 

    internal static bool GetConfigSettingBool(string settingName) 
    { 
     string setting = GetConfigSetting(settingName); 
     if (string.IsNullOrEmpty(setting)) return false; 
     bool value = false; 
     if (bool.TryParse(setting, out value)) 
      return value; 
     else 
      return false; 
    } 

    internal static string[] GetConfigSettingsArray(string settingName) 
    { 
     return GetConfigSetting(settingName).Split(','); 
    } 

    internal static DateTime? GetConfigSettingDateTime(string settingName) 
    { 
     string setting = GetConfigSetting(settingName); 
     DateTime retval; 
     if (DateTime.TryParse(setting, out retval)) 
     { 
      return retval; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    internal static void SetConfigSetting(string settingName, string value){ 
     ConfigurationManager.AppSettings[settingName] = value; 
    } 
0

Sto usando un tipo di configurazione XML di configurazione da qualche tempo, che è gestito fuori il costruito in configurazione, che è una specie di pulito. Fondamentalmente, puoi dargli un suggerimento e deserializzare l'xml direttamente in un oggetto per te. Penso che la fonte originale da cui provengo sia stata here, ma non ne sono sicuro al 100%, quindi se qualcuno conosce l'autore, modifica la mia risposta per dare il giusto credito.

Ecco la classe che fa effettivamente la deserializzazione:

using System.Configuration; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Xml.XPath; 

namespace Ariel.Configuration 
{ 
    class XmlSerializerSectionHandler : IConfigurationSectionHandler 
    { 
     public object Create(object parent, object configContext, XmlNode section) 
     { 
      XPathNavigator nav = section.CreateNavigator(); 
      string typename = (string)nav.Evaluate("string(@type)"); 
      Type t = Type.GetType(typename); 
      XmlSerializer ser = new XmlSerializer(t); 
      return ser.Deserialize(new XmlNodeReader(section)); 
     } 
    } 
} 

Ora, è possibile creare qualsiasi classe che si desidera per la configurazione.

namespace MyProject.Config { 
    public class TestConfig { 
     /// <summary> 
     /// Whether the session is enabled 
     /// </summary> 
     public bool Enabled { get; set; } 
    } 
} 

Ora, tutto ciò che serve è un file app.config. Generalmente preferisco uno stile per utilizzare un file di configurazione separato per ogni classe di configurazione, quindi ti fornirò questo come esempio.

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <section name="TestConfig" type="Ariel.Configuration.XmlSerializerSectionHandler, Ariel"/> 
    </configSections> 
    <runtime> 
    <gcServer enabled="true"/> 
    </runtime> 

    <TestConfig configSource="Config\\TestConfig.config" /> 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> 

le parti più importanti sono: section name = "TestConfig" < - Il tipo di classe di configurazione = Ariel.Configuration.XmlSerializerSectionHandler, Ariel < - Il tipo che viene utilizzato per deserializzare sono xml in un oggetto. Questo in sostanza indica al gestore di configurazione che cosa eseguire per creare il nostro oggetto TestConfig configSource = "Config \ TestConfig.config" < - Questo ci dice dove trovare il file di configurazione per la sezione TestConfig.

sei TestConfig.config file che si sarebbe avere qualcosa di simile:

<?xml version="1.0" encoding="utf-8" ?> 
<TestConfig type="MyProject.Config.TestConfig, MyProject"> 
    <Enabled>True</Enabled> 
</TestConfig> 

Anche in questo caso la parte importante è il riferimento al nome della classe e il tipo.

Ultimo ma non meno importante, di caricare sei configurazione:

using System.Configuration; 
Config.SessionKillConfig config = null; 
try { 
    config = (Config.SessionKillConfig)ConfigurationManager.GetSection("CdrAnalyzerConfig"); 
} catch (System.Configuration.ConfigurationException ex) { 
    syslog.Fatal("Loading parser configuration failed", ex); 
    return; 
} 

if(config.Enabled) { //do stuff } 

Questo può essere un po 'prolisso, ma la cosa è, è abbastanza portatile. Fondamentalmente, per includere la configurazione, tutto ciò che devi fare è scrivere una classe, e poi scrivere un file xml che corrisponda a quello.

Non sono sicuro al 100% come passare il file di configurazione come parametro al programma, ma immagino ci sia un'opzione nella classe ConfigurationManager da qualche parte. Penso addirittura di aver letto da qualche parte che qualcuno stava lavorando per rilevare le modifiche al file e ricaricare la nuova configurazione nel programma in esecuzione, ma non ho provato nulla del genere. Comunque, spero che l'esempio sia utile per un approccio che puoi prendere.

Problemi correlati