Verwalten der dynamischen Websiteeinstellungen, die in einer Datenbank beibehalten werden

8

Ich versuche, etwas zu schaffen, um globale Site-weite Einstellungen in unserer ASP.NET-Website zu halten - Dinge wie Site-Name, Google Analytics-Kontonummer, Facebook-URL usw. Die Website kann mehrere "Marken" oder Sub -Seiten, also die Sitguid-Spalte, möchten wir auch die Möglichkeit haben, sie in Gruppen zu setzen, daher die Gruppenspalte - z TEST und PRODUKTION (eingestellt über web.config appsetting).

Ich möchte nicht, dass irgendeiner der KEYs irgendwo hartcodiert wird, aber ich würde gerne in der Lage sein, sie so einfach wie möglich im Code zu referenzieren, z. SiteSetting.getSetting ("SiteName") (diese können in Vorlagen (Masterpages u.ä.) verwendet werden, die mehr Junior-Entwickler erstellen)

Ich möchte auch die bestehenden Einstellungen in unserer Admin-Konsole verwalten und neue Einstellungen erstellen können.

Die Datentypspalte ist für das Bearbeitungsformular, so dass das korrekte Eingabeelement verwendet werden kann, z. Kontrollkästchen für Bit-Typen, Textfeld für Varchar usw. ...

SiteSettings-Datenbanktabelle derzeit:

%Vor%

Ich bin gerade dabei, dass das im Moment funktioniert, aber ich bin nicht glücklich mit der Art und Weise, wie ich es gemacht habe, und hätte gerne Ratschläge, die Leute hier haben, die helfen könnten, die "richtige" Lösung zu finden! Ich bin mir sicher, dass die Leute das vor mir getan haben. (Ich würde teilen, was ich bisher habe, aber die Antworten nicht auf eine bestimmte Art verfälschen wollen) Alles was ich suche, ist eine Übersicht darüber, wie dies am besten gemacht werden könnte, ohne jemanden zu suchen, der es für mich schreibt; )

Ich habe sowohl hier als auch Google ziemlich viel gesucht und habe nicht wirklich das gefunden, wonach ich suche, insbesondere die Möglichkeit, neue Einstellungsdefinitionen hinzuzufügen und die vorhandenen Einstellungen zu bearbeiten.

>

Das System läuft auf ASP.NET mit Webforms, es ist alles in c # geschrieben und verwendet MSSQL 2008.

Wie immer wird jede Hilfe sehr geschätzt!

BEARBEITEN Um zu verdeutlichen, werde ich erklären, was ich bisher gebaut habe. Ich bin fest entschlossen, all das in SQL zu speichern, da wir nicht wollen, dass web.config oder andere xml-Dateien oder eine andere Datenbank herumschweben, da es uns mehr gibt, wenn wir die App für andere Kunden einführen.

>

Bisher habe ich eine SiteSettings-Klasse, diese hat eine Methode GetSetting, die ich mit GetSetting ("SettingAlias") aufrufen kann, um den Wert für "SettingAlias" im DB zu bekommen. Der Konstruktor dieser Klasse ruft alle Einstellungen für die aktuelle Site aus der Datenbank ab und speichert sie in einem Wörterbuch, liest GetSetting aus diesem Dictionary. All diesen Teil, mit dem ich bisher zufrieden bin.

Der Teil, mit dem ich zu kämpfen habe, erzeugt das Bearbeitungsformular. Die vorherige Version von dieser verwendet einen Webservice, um die Einstellungen zu erhalten / einzustellen und ich versuche, etwas ähnliches zu verwenden, um Arbeit zu sparen, aber sie waren alle im Code definiert, wie GoogleAnalyticsID, Sitename etc ... und jeder hatte eine Spalte In der Datenbank besteht die Änderung, die ich mache, darin, diese Einstellungen als ROWS zu speichern (seitdem ist es einfacher, mehr hinzuzufügen, keine Änderung des Schemas und der gesamten sitesettings-Klasse). Derzeit hat meine SiteSettings-Klasse eine SiteSettingsEditForm-Methode, die packt Alle Informationen aus der db, erstellt eine Reihe von Steuerelementen für die Formularelemente, legt diese auf einer temporären Seite ab und führt sie aus, dann übergibt sie den generierten HTML-Code über Ajax an unser Managementsystem. Das fühlt sich falsch an und ist ein wenig klobig, und es ist der Grund dafür, es hier zu veröffentlichen, ich habe Probleme herauszufinden, wie man diese Dinge über den Webservice speichert, aber noch wichtiger HTML erzeugt, indem man eine Seite mit einer Menge von Formular-Kontrollen fühlen sich einfach wie der falsche Weg, um es zu tun.

Also zusammenfassend möchte ich (glaube ich) eine Klasse schreiben, um Cache & amp; Lesen Sie eine Handvoll Zeilen aus einer Datenbanktabelle und geben Sie mir auch ein Bearbeitungsformular (oder geben Sie Daten an etwas anderes, um das Formular zu generieren) basierend auf dem Inhalt der gleichen Datenbanktabelle (zB wo meine Typspalte Bit ist) 'Ich möchte ein Kontrollkästchen, wo es' Text 'Ich möchte eine Texteingabe)

    
Treborbob 04.04.2012, 17:36
quelle

5 Antworten

3

Manchmal ist diese Art von Problem leichter zu visualisieren, wenn Sie mit dem Datenmodell beginnen. Wenn Sie eine Einstellung pro Zeile wünschen, sind wahrscheinlich zwei Tabellen die beste Möglichkeit, dies zu speichern:

Seite:

%Vor%

Dies würde die Liste der Sites definieren, für die Sie konfiguriert haben. Ich würde einen SiteKey verwenden, wie Sie dies in Ihre web.config einfügen würden und es ist besser, dies in eine zufällige Zeichenfolge oder GUID zu abstrahieren (um das versehentliche Laden der Konfiguration einer anderen Person zu erschweren), kann der Client seinen Namen ändern und Sie werden nicht in der Zukunft verwirrt sein, da Sie ihren alten Namen nicht als Schlüssel usw. verwendet haben.

Die Config-Tabelle selbst ist auch einfach, wenn wir jede Einstellung als String behandeln:

SiteSetting:

%Vor%

Sie können dann die ganze Konfiguration ganz einfach laden:

%Vor%

Jetzt haben wir eine Liste von Schlüsselwertpaaren, die Sie dann in einer Klasse speichern können wie:

%Vor%

Das ist also eine sehr einfache Lösung. Wir können jedoch weiter gehen - Dinge zu beachten:

1) Können wir irgendwo eine Umgebung hinzufügen?

Wir könnten entweder eine Site pro Umgebung hinzufügen

ODER

Fügen Sie der SiteSetting-Tabelle eine Umgebung hinzu. Dies hat den Vorteil, dass Sie environment = 'ALL' definieren können, um Doppelungen zu vermeiden.

ODER

Die Datenbank, aus der die Konfiguration geladen wird, definiert die Umgebung; Sie ändern die Konfigurationsverbindungszeichenfolge in der App-Konfiguration. Um eine Verbindung zu einer anderen Umgebung herzustellen, müssen Sie natürlich app.config ändern, aber Sie müssen dies möglicherweise trotzdem tun, um den Clientschlüssel und / oder die Umgebung zu ändern.

2) Fügen Sie das Konzept der benutzerdefinierbaren Einstellungen hinzu - einige Einstellungen, die Sie ändern möchten, einige, die Sie sperren möchten. Eine Bit-Spalte, die "UserDefinable" enthält, würde es Ihnen ermöglichen, dies zu sortieren

3) Eingabe von Einstellungen.

Das ist etwas schwieriger. Sie könnten etwas wie:

haben %Vor%

Die Settings-Tabelle definiert dann nur einen Wert und eine PropertyId. Der Vorteil besteht darin, dass Sie dann beginnen können, die Informationen zu jeder Einstellung, die Sie speichern, zu erhöhen, und diese Informationen wiederverwenden, da das Design normalisierter ist. Die Settings-Klasse ändert sich dann wie folgt:

%Vor%

PropertyValue sieht dann ungefähr so ​​aus:

%Vor%

Dinge wie die Value-Methode müssen verbessert werden, um eine robuste Fehlerbehandlung zu unterstützen (Sie könnten auch mit Convert.ChangeType untersuchen, um den Switch-Block zu vereinfachen)

Dieses Thema ist so einfach oder so kompliziert wie Sie es sich aussuchen ;-)

Bearbeiten

Was die Aufrechterhaltung betrifft; Eine sehr einfache GUI würde dem Benutzer erlauben, alle seine Eigenschaften in einem Tabellenformat zu sehen. Sie können Zeilen mit UserDefinable = 0 als schreibgeschützt betrachten, andernfalls kann der Benutzer Zeilen bearbeiten und hinzufügen. Sie müssen dies überprüfen, insbesondere für doppelte Einstellungsnamen.

Der einfachste Weg, dies zu tun, ist das DataGrid; Ein einfaches Modell könnte etwa so aussehen:

Und ein ausgefeilterer Ansatz könnte so aussehen wie

Das Erzeugen des Formulars ist daher so einfach wie das Datenbinden einer Sammlung von PropertyValue-Objekten an die ausgewählte Rasterlösung.

    
dash 11.04.2012, 09:29
quelle
1

Wie Sie wahrscheinlich herausgefunden haben, gibt es eine Vielzahl von Möglichkeiten, wie Sie dies tun können, von Microsoft-Empfehlungen bis zu 100% Roll-your-own. Du bist gerade auf der Rolle, dein eigenes Ende des Spektrums zu spielen, was meiner Meinung nach sowieso besser ist.

Nach allem, was Sie suchen, ist ein StateBag. Etwas locker typisiert und in hohem Maße konfigurierbar, was sich für ein RDBMS nicht besonders gut eignet, aber wenn Sie bereits den SQL Server installiert haben, wird es wahrscheinlich am einfachsten sein, diesen zu verwenden.

Option 1: Redis

Eine andere Option besteht jedoch darin, etwas wie Redis für Site-Konfigurationen auszuführen. Sie können sie als eine Sammlung von Schlüssel / Wert-Paaren in einem Redis-Objekt speichern, sie in einem JSON-Objekt abrufen und dann entweder in eine Hashtabelle konvertieren, in der die Suchvorgänge sehr schnell sind, oder in eine andere Sammlung von Hashes. Eine einfache Wrapper-Klasse um die Sammlung würde ausreichen.

Redis ist sehr leicht und würde in Ihrem Fall nicht viel Konfiguration oder Wartung erfordern.

Option 2: SQL Server

Die Art und Weise, wie Sie es erwähnt haben, ist eigentlich eine ziemlich gute Methode, aber anstatt die Datenbank jedes Mal abzufragen, legen Sie eine stark typisierte Sammlung oder Hashtabelle in den Cache und lassen Sie sie alle paar Stunden ablaufen.

Wenn Sie im Wesentlichen mit dem, was Sie jetzt haben, gehen, können Sie es so speichern:

%Vor%

Speichern Sie keine Dinge wie live / test / dev in der Datenbank. Sie müssen vollständig getrennte Datenbanken und Server haben, um zwischen Live / Test / Entwicklung / Phase / QA usw. zu unterscheiden.

    
Jordan 10.04.2012 13:03
quelle
1

ich mache dies im wahrsten Sinne des Wortes, indem ich eine Klasse erzeuge, die alle Einstellungen als Eigenschaften hat wie zB

%Vor%

Dann habe ich eine statische Klasse SettingManager wie folgt erstellt

%Vor%


Gib jetzt irgendwo in deinem Code einfach den Namespace ein und nutze die Einstellungen.
Sie können die Einstellungen einmal oder in jedem Intervall in application_start mit lastRefreshedOn variable auffüllen es wird schnell sein, weil du alle Einstellungen im Speicher hast.

auch wenn du möchtest, dass du die einstellungen dynamisch hinzufügen kannst, dann kannst du ein ExpandoObject verwenden und die einstellungen dynamisch hinzufügen, indem du die spaltennamen aus der datenbank verwendest oder einfach nur ein mapping dann kann ich die Einstellungen verwenden, indem ich die Einstellungen ExpandoObject auf IDictionary<string,object> here string kann die string konvertierte GUID

sein

Bearbeiten: - Ссылка Überprüfen Sie den Link .. Ich habe eine hinzugefügt Neuer Beitrag zur Lösung von Problemen wie diesem.

    
Parv Sharma 10.04.2012 13:13
quelle
0

Wenn ich Ihre Frage richtig verstanden habe, suchen Sie nach einem zentralisierten Konfigurations-Framework. Für Konfiguration & amp; Server-Management Ich würde normalerweise Chef oder Configuration Dienst den Trick für Sie tun könnte. Das Dokument I verknüpft ist ein Schritt für Schritt Anleitung für den Konfigurationsdienst in der .NET StockTrader 5 Beispielanwendung .

    
Marc Gagne 10.04.2012 11:58
quelle
0

Ich würde xml verwenden, eine Klasse erstellen, die xpath als "Schlüssel" verwenden kann
Ex.     %Code%     %Code%      MySett.get("//level1/mysetting")

wo jeder eine Sammlung zurückgeben kann, nur die erste oder was immer Sie wollen. Du könntest sogar überladen. Ich mag XML wegen seiner großen Flexibilität und um Code sonst zu reduzieren, schreibe einfach eine Klasse. Nachteil: Sie müssen Ihr Dokument beim Start der Anwendung laden und beim Herunterfahren speichern. Hier ist eine Beispielklasse in Vb-Code. (C-Code wäre immer noch sehr ähnlich, ich habe gerade Vb verwendet, weil es zu der Zeit war

%Vor%     
Wolf-Kun 10.04.2012 16:57
quelle

Tags und Links