2017-04-18 10 views
0

Ich wollte nur einige Hauptkonfigurationen in einer Einstellungsdatei speichern, da sich die Konfiguration jederzeit ändern kann. Die Benutzer meiner Anwendung werden in der Lage sein, einige Dinge in mehreren Umgebungen zu verwalten. Jede Umgebung hat ihre eigene Konfiguration (Pfade zu Netzwerkstandorten grundlegend).C# - Speichern der Struktur (en) in der Einstellungsdatei

Ich habe eine Struktur für jede Umgebung erstellt, aber jetzt müssen wir einige weitere Umgebungen hinzufügen, daher ist es hilfreich, diese Konfiguration außerhalb des Quellcodes zu speichern.

Also, lassen Sie mich Ihnen einen Code geben. Ich baute zwei structs jede Umgebung zu beschreiben:

public struct env_conf 
{ 
    string title; 
    string path_to_xml; 
    string path_to_sharepoint; 
    List<subfolder> subfolders; 
    //Some more strings 

    public env_conf(string title, string path_to_xml, string path_to_sharepoint ...) 
    { 
    //Constructor which is setting the variables 
    } 
} 

public struct subfolder 
{ 
    string folder; 
    bool is_standard; 

    public env_conf(string folder, bool is_standard) 
    { 
    //Constructor which is setting the variables 
    } 
} 

Und das ist, wie die Umwelt configs eingerichtet sind:

var finance_conf = new env_conf("MyTitle","MyXMLPath","MySPPath", 
new List<subfolder>{new subfolder("MySubFolder",true);new subfolder("MySubFolder2",false)} 
); 

var sales_conf = new env_conf("MySalesTitle","MySalesXMLPath","MySalesSPPath", 
new List<subfolder>{new subfolder("MySalesSubFolder",true);new subfolder("MySalesSubFolder2",false)} 
); 

Dieser letzte Schritt - die Definition der config-Instanzen soll nun sein, innerhalb von eine Einstellungsdatei.

Speichern string und auch string[] in der Einstellungsdatei war für mich bisher kein Problem. Aber jetzt habe ich mehr als das ...

Mehr als das, ich habe kein Visual Studio. Ich arbeite mit SharpDevelop, was bisher sehr gut war.

Das Markieren meiner Strukturen als serialisierbar war nicht hilfreich. Wenn ich den Typ der Einstellung manuell auf MyNamespace.env_conf einstelle, wird er nicht im Einstellungsdesigner angezeigt - nur ein "?" erscheint im Type-Feld. So für jetzt weiß ich nicht weiter. Auch alle Informationen, die ich im Internet finde, scheinen mir nicht zu helfen. Bitte hilf mir.

Wie muss meine XML-Einstellungsdatei bearbeitet werden? Wie muss mein Quellcode bearbeitet werden?

Grüße!

+1

Warum verwenden Sie eine Struktur anstelle einer Klasse? Und was ist falsch mit der Serialisierung? –

+0

Könnte auch eine Klasse sein, du hast Recht. Da ich nur Variablen und keine Funktionen darin habe, wird eine Struktur dasselbe tun. Ich weiß nicht, warum die Serialisierung nicht funktioniert, darum frage ich. – xola

+0

Ich weiß auch nicht, warum Ihre Serialisierung nicht funktioniert - weil * Sie nicht beschreiben, was Sie tun, außer ein Attribut zu setzen *. – grek40

Antwort

0

Ich würde es tun, indem Sie serialisierbare Klassen erstellen, dann können Sie die Konfigurationsdatei zu einer Instanz Ihrer Klasse deserialisieren, und Sie werden alle Einstellungen haben.

Zum Beispiel könnten die Klassen wie folgt aussehen:

[Serializable] 
public class EnvironmentConfig 
{ 
    public string Title { get; set; } 
    public string XmlPath { get; set; } 
    public string SharepointPath { get; set; } 
    public List<SubFolder> SubFolders { get; set; } 
    public override string ToString() 
    { 
     return $"{Title}: {XmlPath}, {SharepointPath}, {string.Join(", ", SubFolders.Select(s => s.Folder))}"; 
    } 
} 

[Serializable] 
public class SubFolder 
{ 
    public string Folder { get; set; } 
    public bool IsStandard { get; set; } 
} 

Und dann in Code können Sie eine Instanz der Klasse erstellen, geben Sie es einige Werte, und serialisiert es zu einer Konfigurationsdatei. Später können Sie diese Datei deserialisieren, um alle Änderungen zu laden, die Ihre Benutzer möglicherweise vorgenommen haben.

In diesem Beispiel wird eine Standardkonfiguration erstellt und die Werte werden in der Konsole angezeigt. Dann gibt es dem Benutzer die Möglichkeit, die Datei zu ändern, und zeigt die neuen Werte an.

// Create a default config 
var defaultEnvCfg = new EnvironmentConfig 
{ 
    Title = "USWE Environment", 
    XmlPath = @"\\server\share\xmlfiles", 
    SharepointPath = @"\\server\sites\enterpriseportal\documents", 

    SubFolders = new List<SubFolder> 
    { 
     new SubFolder { Folder = "Folder1", IsStandard = true }, 
     new SubFolder { Folder = "Folder2", IsStandard = false } 
    } 
}; 

// Display original values: 
Console.WriteLine(defaultEnvCfg.ToString()); 

// Serialize the config to a file 
var pathToEnvCfg = @"c:\public\temp\Environment.config"; 
var serializer = new XmlSerializer(defaultEnvCfg.GetType()); 

using (var writer = new XmlTextWriter(
    pathToEnvCfg, Encoding.UTF8) { Formatting = Formatting.Indented }) 
{ 
    serializer.Serialize(writer, defaultEnvCfg); 
} 

// Prompt user to change the file 
Console.Write($"Please modify the file then press [Enter] when done: {pathToEnvCfg}"); 
Console.ReadLine(); 

// Deserialize the modified file and update our object with the new settings 
using (var reader = XmlReader.Create(pathToEnvCfg)) 
{ 
    defaultEnvCfg = (EnvironmentConfig)serializer.Deserialize(reader); 
} 

// Display new values: 
Console.WriteLine(defaultEnvCfg.ToString()); 

Console.Write("\nDone!\nPress any key to exit..."); 
Console.ReadKey(); 
Verwandte Themen