Protokollverwaltung
Serverseite (Serverseite)
ASP.NET -Kesselplatte verwendet das Protokollierungswerkzeug von Castle Windsors Protokollierungsanlagen und kann verschiedene Protokollklassenbibliotheken verwenden, z. B. log4Net, Nlog, Serilog ... usw. Für alle Protokollklassenbibliotheken bietet Castle eine allgemeine Schnittstelle zum Implementieren.
Anmerkung des Übersetzers: Was ist Castle: Castle ist ein Open -Source -Projekt für die .NET -Plattform, vom Datenzugriffsframework über IOC -Container bis hin zum MVC -Framework und AOP in der Webschicht, es enthält im Grunde alles im gesamten Entwicklungsprozess. Der IOC -Container der ASP.NET -Kesselplatte wird über Castle implementiert.
LOG4NET ist die beliebteste Protokollbibliothekskomponente unter ASP.NET. .
Holen Sie sich Logger
Unabhängig davon, welche Protokollbibliothekskomponente Sie auswählen, ist es für den Code gleich. (Beschwerde hier ist Castle's Universal Iloogger Interface wirklich großartig).
Kommen wir zum Thema: (Anmerkung des Übersetzers: Der folgende Code ist das Castle.Core -Quellcodeanalyse und -implementierung des ABP -Frameworks)
1. Zunächst müssen wir zuerst mit dem Logger -Objekt -Logger umgehen.
Schauen wir uns anschließend an, wie ASP.NET -Boilerplate die Protokollierungsfunktion implementiert:
Castle.core.logging; Hier definieren wir zuerst einen Logger für öffentliche Eigenschaften des Iloogger -Typs, das das Objekt ist, mit dem Protokolle aufgezeichnet werden. Nach dem Erstellen des TaskAppService -Objekts (die in unserer Anwendung definierte Aufgabe) wird es durch Attributinjektion implementiert. public iloogger logger {get; Dies ist der beste Weg, um die Abhängigkeitsinjektion zu implementieren. Wenn Sie diesen leeren Logger nicht definieren, wird eine Ausnahme generiert, wenn wir die Objektreferenz erhalten und sie instanziieren. // Dies stellt sicher, dass das Objekt nicht leer ist. Mit anderen Worten, ohne einen Logger einzurichten, wird das Protokoll nicht aufgezeichnet und ein Null -Objekt wird zurückgegeben. // Das NullLogger -Objekt ist eigentlich nichts, leer. Nur dadurch können wir sicherstellen, dass die Klassen, die wir bei der Instanziierung wirken, normal definieren. Logger = nullLogger.instance; }} Die Codekopie lautet wie folgt:Info 2014-07-13 13: 40: 23.360 [8] SimplyTasSystem.Tasks.TaskAppService-Erstellen einer neuen Aufgabe mit Beschreibung: Denken Sie daran, Milch vor dem Schlafengehen zu trinken!
Nach dem Schreiben in das Protokoll können wir die Protokolldatei genau wie das folgende Format anzeigen:
Verwenden Sie Logger über BasisklasseDas ASP.NET -Boilerplate -Framework bietet die Basisklassen von MVC -Controllern, Web -API -Controllern und Anwendungsdienstklassen (die Controller- und Anwendungsdienste, die Sie selbst definieren, müssen die Basisklassen von ASP.NET -Boilerplate erben. Mit anderen Worten, wenn Sie es anpassen. Die Web -API -Controller, MVC -Controller und Anwendungsdienstklassen erben die Basisklassen, die dem ASP.NET -Kesselplatten -Framework entsprechen, sodass Sie den Protokoll direkt verwenden können).
public class homecontroller: simpleetasStemcontrollerbase {public actionResult index () {logger.debug (eine Beispielprotokollnachricht ...);Beschreibung: SimpleTasSystemControllerBase Dieser Basisklassencontroller ist der Basisklassencontroller, den wir selbst definieren, und er muss von AbpController erben.
Auf diese Weise kann der Logger normal funktionieren. Natürlich können Sie auch Ihre eigene Basisklasse implementieren, damit Sie keine Abhängigkeitsinjektion mehr verwenden können.
Konfiguration
Wenn Sie Ihr Projekt über ASP.NET -Boilerplate -Vorlagen auf der offiziellen Website generieren, werden alle Konfigurationen von LOG4NET automatisch generiert.
Das Standardkonfigurationsformat lautet wie folgt:
• Protokollstufe: Protokollaufzeichnungsstufe, 5 Debugg, Info, Warn, Fehler oder tödlich.
• Datum und Uhrzeit: Protokollierungszeit.
• Threadnummer: Die Threadnummer, wenn jede Protokollzeile geschrieben wird.
• Logger -Name: Der Name des Loggers, normalerweise der Klassenname.
• Protokolltext: Der von Ihnen geschriebene Protokollinhalt.
Konfigurationsdatei: log4net.config befindet sich normalerweise im Webverzeichnis des Projekts.
<xml Version = 1.0 coding = utf-8?> <log4net> <appender name = rollingFileAppender type = log4net.appender.rollingFileAppender> <Datei value = logs.txt /> <appendtofile value = true /> <RollingStyle Value Value = Größe /> <maxSizerollbackups value = 10 /> <maximumFileSize value = 10000KB /> <StaticLogFileName value = true /> <Layout type = log4net.layout.patternLayout> <ConversionPattern Value = %-5LEVEL %Datum [ %-5,5 Thread] %-40.40Logger- %Meldung %Newline /> < /layout> < /appender> <root> <appender-ref ref = rollingFileAppender /> <Level-Wert = Wert = Debug/> </root> <logger name = nhiberNate> <Level Value = Warn/> </logger> </log4net>
LOG4NET ist eine sehr leistungsstarke und benutzerfreundliche Protokollbibliothekskomponente. Sie können die minimale Protokollebene genau wie die obige Konfiguration für NHiberNate festlegen. Verschiedene Holzfäller schreiben verschiedene Protokolle usw.
Für eine bestimmte Verwendung finden Sie unter: http://logging.apache.org/log4net/release/config-examples.html
Definieren Sie schließlich in der Global.asax -Datei des Projekts die Log4Net -Konfigurationsdatei:
öffentliche Klasse MVCapplication: ABPWebApplication {Protected Override void application_start (Objektabsender, EventArgs e) {IocManager.instance.ICContainer.Addfacility <Plors Absender, e);Ein paar Zeilen von Code Call 4NET, die Protokollierungskomponente. Denn unser Rahmen implementiert den Logger durch Abhängigkeitsinjektion!
Kundenseite (Client)
Noch erstaunlicher ist, dass Sie den Logger auch auf der Client -Seite anrufen können. Auf der Client -Seite verfügt das ASP.NET -Kesselplatten -Framework über eine entsprechende JavaScript -Protokoll -API, was bedeutet, dass Sie die Protokolle des Browsers aufzeichnen können, und der Implementierungscode lautet wie folgt:
ABP.Log.Warn ('eine Beispielprotokollnachricht ...');Angehängt: Die Client -JavaScript -API, die Sie hier erklären müssen, ist, dass Sie Console.log verwenden können, um Protokolle auf dem Client auszugeben. Diese API unterstützt jedoch nicht unbedingt alle Browser und kann Ausnahmen von Ihrem Skript verursachen. APIs, unsere sind sicher und Sie können diese APIs sogar überladen oder erweitern.
abp.log.debug ('...'); abp.log.info ('...'); abp.log.warn ('...'); abp.log.Eror ('...' );Einstellungsverwaltung
einführen
Jede Anwendung muss einige Einstellungen speichern und irgendwo in der Anwendung verwenden. Das ABP-Framework bietet eine leistungsstarke Infrastruktur, die wir auf dem Server oder dem Client festlegen können, um Konfigurationen auf Anwendung, Mieter und Benutzerebene zu speichern/abzurufen.
Die Einstellungen werden normalerweise in einer Datenbank (oder einer anderen Quelle) gespeichert, die durch die Struktur dargestellt wird, die der Namenswerte-Zeichenfolge entspricht. Wir können Nicht-Stringwerte in Zeichenfolgenwerte für den Speicher umwandeln.
Hinweis: Über die IsettingStore -Schnittstelle
Um die Einstellungsverwaltung zu verwenden, muss die IsettingStore -Schnittstelle implementiert werden. Sie können es auf Ihre eigene Weise implementieren, und es gibt vollständige Implementierungen im Modul-Null-Projekt, auf das Sie sich beziehen können.
Einstellungen definieren
Sie müssen die Einstellungen definieren, bevor Sie sie verwenden. Das ABP -Framework ist ein modulares Design, sodass verschiedene Module unterschiedliche Einstellungen haben können. Um die eigenen Einstellungen des Moduls zu definieren, sollte jedes Modul eine abgeleitete Klasse erstellen, die von SettingProvider geerbt wird. Das Beispiel für Setup -Anbieter lautet wie folgt:
öffentliche Klasse MySettingProvider: SetingProvider {public Override iEnumerable <SetingDeFinition> GetSetingDeFinitions (SettingDefinitionProviderContext -Kontext) {neu [] {New SettingDeFinition (SMTPServeraddress, 127.0.0.1), New SettingDefinition (PassiveSectionScressScoppation: .Vermedant) , neue Einstellungdefinition ( SiteColorPreference, Rot, Scopes: SettingScopes.User, isvissibletoclients: true)}}}}}}}};Die Methode zur GetS -DingDeFinitions gibt das Einstelldefinitionsobjekt zurück. Der Konstruktor der SettingDefinition -Klasse hat die folgenden Parameter:
• Name (erforderlich): Muss einen eindeutigen Namen im gesamten System haben. Ein besserer Weg ist es, String -Konstanten zu definieren, um den Namen festzulegen.
• Standardwert: Legt einen Standardwert fest. Dieser Wert kann null oder eine leere Zeichenfolge sein.
• Scopes: Definiert den Umfang der Einstellung (siehe unten).
• Anzeigename: Eine lokalisierbare Zeichenfolge für die spätere Anzeige des festgelegten Namens in der Benutzeroberfläche.
• Beschreibung: Eine lokalisierbare Zeichenfolge zum späteren Anzeigen der Beschreibung der Einstellungen in der Benutzeroberfläche.
• Gruppe: Kann zum Einrichten von Gruppen verwendet werden. Dies dient nur zur Benutzeroberfläche und ist nicht für die Festlegung des Managements.
• Isvissibletoclients: Die Einstellung zu True macht die Einstellungen im Client verfügbar.
Nach dem Erstellen des SettingProvider sollten wir unser Modul in der Präintialisierungsmethode registrieren:
Configuration.Settings.Providers.Add <MySetingProvider> (); Daher kann der Setup -Anbieter Abhängigkeiten (z. B. ein Repository) injizieren, um eine andere Quelle der Setup -Definition zu generieren.
Stellen Sie den Bereich ein
Es gibt drei Einstellungen (oder Ebenen), die in der Einlage von Einstellungen definiert sind:
• Anwendung: Anwendungsweite Einstellungen werden für unabhängige Einstellungen für Benutzer/Mieter verwendet. Zum Beispiel können wir eine Einstellung namens SMTPServeraddress definieren, die beim Senden einer E -Mail die IP -Adresse des Servers erhält. Wenn diese Einstellung einen einzelnen Wert hat (nicht basierend auf dem Benutzer geändert), können wir sie als Anwendungsbereich definieren.
• Mieter: Wenn die Anwendung meriant ist, können wir mieterspezifische Einstellungen definieren.
• Benutzer: Wir können benutzerweite Einstellungen verwenden, um die Werte für jeden Benutzer zu speichern/abzurufen.
Die Einstellungsscopes Enum verfügt über eine Flags -Eigenschaft, sodass wir eine Einstellung mit mehreren Scopes definieren können.
Der Einstellungsbereich ist hierarchisch. Wenn wir beispielsweise den Einstellungsbereich für die Anwendung definieren |
• Wir erhalten den Wert eines bestimmten Benutzers, wenn er den Benutzer definiert (umschreiben).
• Wenn nicht, erhalten wir den spezifischen Mieterwert, wenn er den Mieter definiert (umschreiben).
• Wenn nicht, erhalten wir den Wert der Anwendung, wenn sie die Anwendung definiert.
• Wenn nicht, erhalten wir den Standardwert.
Der Standardwert kann null oder eine leere Zeichenfolge sein. Wenn möglich, wird empfohlen, einen Standardwert für die Einstellungen bereitzustellen.
Holen Sie sich den festgelegten Wert
Nachdem wir die Einstellungen definiert haben, können wir den aktuellen Wert auf Server und Client erhalten.
(1) Serverseite
IsettingManager wird verwendet, um Einstellungen auszuführen. Wir können es überall in der Anwendung injizieren und verwenden. IsettingManager definiert viele Methoden, um festgelegte Werte zu erhalten.
Die am häufigsten verwendete Methode ist GetSettingValue (oder GetsetingValueasync ist ein asynchroner Aufruf). Es gibt den aktuell festgelegten Wert basierend auf dem Bereich Standard-, Anwendung, Mieter und Benutzereinstellungen (wie im Absatz vor dem Einstellbereich beschrieben). Beispiel:
// Erhalten Sie einen booleschen Wert (Async Call) var value1 = Await SettingManager.getSetingValueEsync <Bol> (PassiveusersCannotlogin); // Abrufen eines String -Werts (Sync Call) var value2 = SettingManager.getSetingValue (SMTPServerAddress);
GetSettingValue verfügt über generische und asynchrone Versionen, wie oben gezeigt. Es gibt auch Möglichkeiten, eine Liste von Einstellungen für einen bestimmten Mieter oder Benutzer oder alle Einstellungen dafür zu erhalten.
Da IsettingManager weit verbreitet ist, haben einige spezifische Basisklassen (wie Anwendungsservice, Domainservice und ABPController) eine Eigenschaft namens SettingManager. Wenn wir aus diesen Klassen erben, müssen sie nicht explizit injizieren.
(2) Kunde
Wenn isvissibletoclients beim Definieren der Einstellungen auf true eingestellt ist, können Sie den aktuellen Wert mit JavaScript im Client erhalten. ABP.Setting Der Namespace definiert die erforderlichen Funktionen und Objekte. Beispiel:
var currentColor = abp.setting.get (SiteColorPreference); Sie können das Objekt von ABP.Setting.Values verwenden, um alle Werte zu erhalten. Beachten Sie, dass der Client diese Änderung nicht weiß, wenn Sie die Einstellungen auf der Serverseite ändern, es sei denn, die Seite wird in irgendeiner Weise aktualisiert oder neu geladen oder manuell über Code manuell aktualisiert.
Einstellungen ändern
IsettingManager definiert ÄnderungensetingForApplicationAsync, ÄnderungensetingForenantaSync und Änderungensetingforuserasync -Methoden (und der synchronen Version), um die Einstellungen der Anwendung, des Mieters und des Benutzers separat zu ändern.
Über Cache
Der Cache befindet sich im serverseitigen Einstellungsmanagement, sodass wir die Anweisung Repository oder Datenbank-Update nicht direkt verwenden sollten, um den festgelegten Wert zu ändern.