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.
concordato. Perché le persone devono reinventare la ruota? – RPM1984
Posso aggiornare le impostazioni in seguito? – Jichao
@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 –