Wo zum speichern von Anwendungseinstellungen?
Kürzlich habe ich entdeckt, dass die "Web.Config" - Datei enthält eine <appSettings>
Abschnitt, was wohl gut für die Speicherung einer Anwendung Einstellungen. Was solls, es hat sogar eine programmgesteuerte Möglichkeit, um den Zugriff auf die Datei durch ein standard-System-Bibliothek. So ganz clever, schrieb ich eine Schnittstelle darauf zugreifen und dann eine Konkrete Implementierung der Schnittstelle, hier gezeigt:
public interface IAppSettings
{
IEnumerable<string> GetValues(string componentName, string settingName);
IEnumerable<KeyValuePair<string, string>> GetValuePairs(string componentName, string settingName);
void SetValues(string componentName, string settingName, IEnumerable<string> valueList, bool append);
void SetValuePairs(string componentName, string settingName, IEnumerable<KeyValuePair<string, string>> pairList, bool append);
}
Dann kam ich zu entdecken, dass speichern Einstellungen zurück zu "web -.config", während die Anwendung ausgeführt wird, bewirkt, dass die gesamte Anwendung neu zu starten. Dies scheint völlig unvernünftig für mich, weil wenn ich Schreibe wieder zu web.config eine Menge und die Anwendung neu gestartet wird jedes mal, wenn, dann Dinge wie HttpRuntime.Cache vollständig geleert effektiv machen mein Cache nutzlos, weil es ständig entleeren und sich vermehren.
So Frage ich mich: Wo Lagere ich meine Programmeinstellungen?
Ist es eine gute Lösung gibt für diese, so dass ich nicht roll meine eigenen?
EDIT:
Okay, vielen Dank an alle, vorgeschlagen, mit einem DB-und einem potentiellen Tabelle schema. Ich denke, ich werde gehen, mit dem folgenden schema:
settings:
index NUMBER NOT NULL AUTO_INCREMENT <== Primary Key
component NVARCHAR(255) NOT NULL
setting NVARCHAR(255) NOT NULL
key NVARCHAR(255)
value NVARCHAR(255) NOT NULL
Obwohl ich nicht denke, das werde ich machen "Einstellung" die P-Taste, aber verwenden Sie eine Auto-Incr Index statt. Auf diese Weise, wenn ich eine Anwendung haben, muss mail etwas, um mehrere Manager, ich kann speichern Sie viele:
index component setting value
1 RequestModule ManagerEmail manager1@someplace
2 RequestModule ManagerEmail manager2@someplace
Und dann kann ich verwenden:
IEnumerable<string> GetValues(string componentName, string settingName);
Und es gibt eine Liste von E-Mail-Adressen, anstatt nur einen einzelnen Wert.
Macht das Sinn?
- Mit DB speichert applciation Einstellungen ist OK, aber bitte speichern Sie die Einstellungen im Cache. Einstellungen im web-config sind schnell zu Lesen, da Sie im server-memery. Wenn Sie ständig Lesen Sie die Einstellungen in evvery Seite hinzufügen-Zwischenspeichern, um Ihre Einstellungen und auch entfernen Sie den cache, wenn die Einstellungen aktualisiert werden.
- nach Ihrer Bearbeiten, bearbeitete ich meine Antwort. Beachten Sie, dass, wenn Sie zwei Fragen haben, bitten Sie Sie separat, anstelle der Zugabe der zweiten Frage zu dem vorhergehenden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
web.config ist in der Regel verwendet für nur-lese-Einstellungen, dh. die Einstellungen festgelegt, die bei der Bereitstellung der Anwendung durch den system-administrator.
Wenn Sie möchten, Lesen Sie und schreiben Sie die Einstellungen, die naheliegendste Möglichkeit ist die Verwendung der Datenbank. Durch die Art und Weise, dies hat eine Vorteil: eine Anwendung gehostet werden kann, auf mehrere Server und noch Lesen und schreiben, die Einstellungen korrekt,
Können Sie auch implementieren, um Ihre benutzerdefinierte Speicher für die Einstellungen, aber es wird wahrscheinlich schwieriger zu implementieren ist und nicht viel schneller.
Zur Beantwortung Ihrer zweiten Frage, der Struktur Ihrer Datenbank hängt von der Art der Einstellungen, die Sie speichern möchten.
Wenn Sie brauchen, um store heterogenen eindeutige Einträge wie diese:
dann müssen Sie
varchar
s oder anderen mehr oder weniger freundlich-Typen als Schlüssel zum identifizieren der Einträge (anstatt zu verweisen, die Ihnen von Ihren index).Auf der anderen Seite, wenn Ihr Zweck ist, zu speichern Sie die E-mail-Adressen, die von mehreren Managern, sollten Sie eine
Manager
Tabelle mit Ihrer E-mail-Adressen, Namen, datetime Ihrer letzten Verbindung, etc.Sie sollten wirklich nicht mischen. In der Theorie, können Sie beziehen sich auf den Eintrag in den Einstellungen durch die Komponente/Einstellung-pair-Mädchen. In der Praxis macht es die Sache schwieriger und schafft eine Reihe von Problemen mit sich:
Speichern der Einstellungen in web.config ist nützlich, weil es macht es einfach zu unterschiedliche Einstellungen in unterschiedlichen Umgebungen. Aber, wie du sagst, diese nicht zu verwenden, wenn Sie sind wahrscheinlich zu wollen, ändern Sie die Einstellungen in einer live-Umgebung.
Eine einfache Datenbank-Tabelle ist der nützlichste Weg, dies zu tun, wenn Sie brauchen, um die Werte zu ändern.
zB.
Wenn Sie SQL Server verwenden, können Sie festlegen, ob die
Value
Spaltesql_variant
die können Sie speichern eine Vielzahl von Datentypen.sql_variant
.nvarchar(max)
ist keine gute Idee, wenn die Speicherung von Daten jeglicher Art (nicht zu erwähnenvarchar(100)
).Es ist gedacht für die Anwendung Einstellungen, aber nicht die Einstellungen, die gemeint sind, werden dynamisch zur Laufzeit verändert. Es ist eher für Einstellungen, ändern sich nur gelegentlich, und wo man erwarten würde (und auch Lust), eine app neu zu starten, wenn Sie sich ändern.
Weitere Ephemere Einstellungen, die Sie möglicherweise möchten, benutzen Sie einfach eine einfache Datenbank-system - auch ein flat-file/XML in der
App_Data
dir arbeiten können, wenn Sie Ihre app nicht eine Datenbank sonst.Ja.Ändern des web.config wird das Programm zurückgesetzt.Ich in der Regel halten eine settings-Tabelle zum speichern von Schlüssel-Wert-Paare für die Einstellungen und den Zugriff von dort aus.
EINSTELLUNGEN
Schreiben Sie dann eine Klasse, die kann Insert -, Delete -, Update-Werte für diese Tabelle.
Ex-Daten für die EINSTELLUNGEN der Tabelle
name
sollte Primärschlüssel. Separate Spalten keinen Sinn machtIch in der Regel fügen Sie ein "Typ" - Feld auf "meine Einstellungen" - Tabelle, so dass ich nur abrufen, die Gruppe von Einstellungen, die benötigt werden, das funktioniert für mich als eine Möglichkeit der Gruppierung wie Einstellungen und abrufen von Ihnen auf einmal.
Erstellen Sie eine Schlüssel-Wert-Tabelle wie diese:
Zuerst von allen, ist es nicht unvernünftig, wenn man bedenkt, welche Informationen sollen gespeichert werden, in der web.config-Datei. Wenn Sie Dinge ändern, wie die assembly Informationen, Verbindungszeichenfolgen, etc., Ihre Anwendung zu beenden und neu laden der Werte zu führen, die mit diesen Einstellungen.
Wenn Sie die Speicherung Anwendung systemweite Einstellungen, dann können Sie eine der Einstellungen-Tabelle in Ihrer Datenbank oder sogar mit einem separaten text-Datei speichern Sie die Einstellungen.
Wenn Sie sprechen über das speichern von Einstellungen pro Benutzer, Sie sollen check-out ASP.NET Profil-Eigenschaften.
Anwendungsweiten Einstellungen sollten sicher gespeichert werden in diesem Abschnitt der web.config-Datei, da dies verhindert, dass hart codiert werden Werte, die sich mit der Zeit ändern kann. Es gibt keine Notwendigkeit, Sie zu Lesen, sich mit Ihren eigenen code, da es eine integrierte Methode: verwenden Sie die
System.Configuration.ConfigurationManager.AppSettings
array abrufen, die Sie (müssen Sie fügen Sie einen Verweis auf System.Configuration assembly in eurem Projekt). Sie können Bearbeiten AppSettings durch die ASP.NET Web-Site-Administration-Tool zu (Projekt-Menü -> ASP.NET -Konfiguration).Für Werte, die Sie ins Auge fassen, das ändern oft mehr, und während die Website ist und läuft, ist es vernünftig zu verwenden, eine XML-Datei, einfache Datenbank (z.B. SQLite oder SQL Server Compact) oder sogar eine text-Datei für diese Einstellungen.
Wenn Sie brauchen, um die Einstellungen zu speichern, Sie können immer speichern Sie Sie in eine benutzerdefinierte Konfigurationsdatei.
Ich dachte nur, dass eine Weile zurück, und ich habe den code zur Verfügung, es zu tun hier.