2016-09-01 26 views
5

Die .NET-Konfigurationseinstellungen sind nicht so flexibel, wie ich es möchte. Wenn ich Application Settings richtig verstehe, bin ich eingeschränkt, wenn ich Einstellungen ändern/bearbeiten kann. In C# sind die Anwendungseinstellungen in zwei verschiedene Typen oder Bereiche ("Anwendung" und "Benutzer") unterteilt, beide haben jedoch Einschränkungen in Bezug darauf, wie sie geändert oder geändert werden können. Die folgende Tabelle zeigt die differnce:Bearbeiten/Ändern von C# -Anwendungseinstellungen

 
    SCOPE: | EDIT AT DESIGN-TIME: |  EDIT AT RUN-TIME:  | EDIT BETWEEN SESSIONS: 
--------------------------------------------------------------------------------------- 
    User  | Setings.settings | Settings.Default.Save() |  *Not supported*  
Application | Setings.settings |  *Not supported*  | edit app.exe.config 

Gibt es eine „eingebaute“ Einstellungen Funktionen, die mir erlauben, Einstellungen von allen drei Mechanismen zu bearbeiten? Eine der Hauptmotivationen für die Verwendung einer Konfigurationsdatei besteht darin, Benutzern das Ändern von Standardwerten zu ermöglichen, ohne den Quellcode neu erstellen zu müssen (wie dies mit den Einstellungen Application-scoped möglich ist). Der Benutzer sollte jedoch nicht erzwungen zum Bearbeiten einer .config-Datei sein; Sie sollten auch in der Lage sein, zur Laufzeit eine Änderung vorzunehmen, die sich über die Einstellungen hinweg fortsetzt (wie dies mit den Einstellungen Benutzerdefiniert möglich ist). Sicherlich muss es einen Mechanismus geben, der beide Funktionalitäten bietet.

BOTTOM LINE: Warum können die Anwendungseinstellungen (app.exe.config) nicht zur Laufzeit bearbeitet werden? Das würde alle meine Probleme lösen. Ich verstehe, dass dies Probleme für Benutzer verursachen könnte, die denselben Computer verwenden. Aber wer macht das mehr?

POTENTIAL Abhilfe: Gibt es trotzdem den Standard-Speicherort für die Benutzereinstellungen Konfigurationsdatei in einen nicht versteckt Ordner zu ändern?


UPDATE (zur Klarstellung): Was ich sagen will ist, dass ich eine Standard-Einstellung zu ändern bei Entwurfszeit, bei Laufzeit, in der Lage sein wollen oderZwischensitzungen (zB durch Bearbeiten einer Konfigurationsdatei). Aber wenn ich die eingebauten C# Persistenzmechanismen verwende, die von Settings.settings zur Verfügung gestellt werden, muss ich höchstens 2 von 3 auswählen. Fehle ich etwas? Gibt es eine andere Alternative, die mir nicht bekannt ist?

[Use Case: Ich möchte für die Verbindungszeichenfolge ein „default“ Datenbanknamen speichern, aber ich möchte, dass die Benutzer in der Lage sein, eine andere Datenbank zur Laufzeit angeben (und damit werden die „neue“ Standard für diesen Benutzer). Aber ich möchte auch in der Lage sein, die standardmäßig in der Datei config überschreiben, ohne wieder laufen oder Wiederaufbau der Anwendung]

[BETTER Use Case:. (In Reaktion auf die Kommentare)

Ich habe ein Computermodell mit einer Konfigurationsdatei, die die Standardwerte für Parameter im Modell enthält. Benutzer A startet das Modell und entscheidet, den Wert einiger Parameter zu ändern. Diese Änderung muss persist für alle zukünftigen Sitzungen für diesen Benutzer (d. H. Bearbeiten bei RTunTime). Anschließend möchte dieser Benutzer diese geänderte Konfigurationsdatei mit seinem Team teilen (z. B. über das Versionskontroll-Repository oder per E-Mail). Dies würde es Benutzer B ermöglichen, ihre Standardparameterwerte zu aktualisieren (um Benutzer A zu entsprechen), ohne sie manuell in der Anwendung ändern zu müssen (d. H. Zwischen Sitzungen bearbeiten). Alle diese Mods sollten NACH Design-Zeit passieren.]

* Ich weiß, dass ich kann „technisch“ bearbeiten benutzer scoped Einstellungen in der app.exe.config Datei in dem versteckten AppData-Ordner befindet, aber das ist eine versteckte Datei und nicht alle Benutzer über ausreichende Berechtigungen haben um es zu sehen. (ABER siehe oben "Mögliche Abhilfe".)

+0

Als mein Mangel an Wissen, habe ich solche Situationen nicht überwunden.Aber mit app.config können Sie Ihre Einstellung in den Namen Wert Paare definieren und kann den Namen zur Laufzeit entsprechend wählen. –

+1

Eines der ersten Dinge, die ich kurz nach dem Wissen über 'C#' gelernt habe, war die Serialisierung. Während Wörterbücher schön sind, sind sie nicht gut, um komplexe Daten zu enthalten, müssen jedes Mal umwandeln, wenn Sie auf Daten zugreifen, Fehler enthalten (vor allem durch Benutzerbearbeitungen) ... Serialisierung/Deserialisierung ist so einfach mit 'XmlSerializer' also warum stören mit 'Einstellungen' überhaupt? Ich fand JSON, das beste Format zu sein, um Einstellungen zu halten. – Sinatr

+2

Ohne die Erhöhung des Administrators sollte ein Benutzer nicht in der Lage sein, Einstellungen zu aktualisieren, die für alle Benutzer gelten, da ein Benutzer möglicherweise unerwünschte Änderungen vornimmt, die sich auf andere Benutzer auswirken.Es macht also durchaus Sinn, dass es schwieriger ist, die Anwendungseinstellungen zu ändern ... – Phil1970

Antwort

0

Alles, was Sie tun müssen, ist die Kombination der beiden Techniken!

Lesen Sie zu Beginn einer Sitzung die konfigurierte Einstellung aus einer Konfigurationsdatei und speichern Sie sie in einer globalen statischen Variablen (oder einer beliebigen anderen Persistenz), die beschreibbar ist.

Wenn ein Benutzer sich entscheidet, diese Einstellung zu ändern, ändern Sie einfach den Wert der Einstellung.

public static Program { 

    public static string ConnectionString { get; set; } 

    void Main(string connectionString) { 
     ConnectionString = connectionString; 
    } 

} 

public class SomeOtherClass { 
    public void SomeOtherMethod() { 
     Program.ConnectionString = "new value"; 
    } 
} 

Dies ist nur ein sehr triviales Beispiel dafür, wie Sie das verwenden würden. Beachten Sie, dass Sie anstelle der Übergabe der Zeichenfolge als Argument an das Programm wahrscheinlich den Standardwert aus den Anwendungseinstellungen lesen würden. Sie würden wahrscheinlich auch die benutzerkonfigurierte Connectionstring in einer Art von Datenbank speichern, so dass für jeden Benutzer die Datenbank unterschiedlich sein könnte.

+0

Ich fürchte, das scheint meine Frage überhaupt nicht zu beantworten. Ich sehe nicht, wie sich dieser Ansatz von dem in meinem ursprünglichen Beitrag beschriebenen "Benutzerumfang" unterscheidet. Außerdem bin ich nicht sicher, wie es sinnvoll wäre, eine Datenbankverbindungszeichenfolge in einer Datenbank zu speichern. (Siehe den Anwendungsfall in meinem Post.) – kmote

+0

Sie sagen also, dass Sie beim Starten der Anwendung eine Standardeinstellung ändern können? Außerdem hast du natürlich Recht mit der Verbindungszeichenfolge, also ist dieses Beispiel irgendwie krumm. Der Punkt, den ich versucht habe, ist jedoch, dass Sie jede Art von Persistenz wählen können, wenn es darum geht, die benutzerkonfigurierte Einstellung zu speichern (es sei denn, der Zugriff auf den Speicher hängt von der Einstellung ab). – Glubus

+0

Was ich damit sagen will ist, dass ich eine Standard-Einstellung zur Design-Zeit, zur Laufzeit (d. H. Wenn die Anwendung gestartet wird), _oder_ zwischen den Sitzungen ändern kann. – kmote

0

Was, wenn Sie das Folgende in der Fallstudie ausprobiert haben und Sie könnten es verallgemeinern?

  1. Solange der Benutzer die Standarddatenbanknamen ändern können, so dass dieser Schlüssel sollte unter dem Benutzerbereich und nicht den Anwendungsbereich
  2. Nach der Installation der Anwendung, die ich eine Windows-Anwendung übernehmen definiert werden, und auf die zuerst ausführen, prüfen, ob die user.config den Wert von Datenbankname hat, falls ja, beim Laden der Anwendung fortfahren, andernfalls zu Schritt 3 gehen.
  3. Zeigen Sie dem Benutzer einen Bildschirm mit dem Datenbanknamen hat einen Standardwert und den Benutzer kann die Einstellungen ändern und stellen Sie sicher, dass einige Validierungen hier, nach Abschluss der Einstellungen Seite, speichern Sie sie in der Datei user.config, so dass Ihre Anwendung beim nächsten Lauf, die erforderlichen Einstellungen finden wird um normal zu laufen.
  4. Für Administratorberechtigungen können Sie eine Schaltfläche anzeigen, um die Einstellungen zur Laufzeit zu ändern.

Ich verwende diese Technik für alle Anwendungen, die vom Benutzer benötigt einige wichtige Details wie zu definieren „wo die Bilder zu speichern, den Namen der Datenbank, die Verbindungszeichenfolge, ... etc“

hoffen, dass dies geben Sie einen Tipp oder etwas

+0

Danke, Hadi. Das ist im Wesentlichen der Prozess, den ich jetzt verwende (obwohl ohne die Überprüfung in Schritt 2). Ich hatte gehofft, eine Lösung zu finden, mit der Benutzer den Standard ändern können, ohne das Programm auszuführen. – kmote

Verwandte Themen