ABP ist ein Webentwicklungsrahmen, das auf ASP.NET basiert. Die Log- und Framework -Einstellungen sind ebenfalls relativ vollständig. Hier führt der Editor des neuen Technologiekanals im Detail die grundlegende Konfiguration des Protokollmanagements und der Einstellungsverwaltung im ABP -Framework ein. Freunde in Not können sich sorgfältig darauf beziehen!
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 zur Implementierung. Wir können verschiedene spezielle Protokollbibliotheken problemlos bewältigen, und es ist einfach, die Protokollkomponenten zu ersetzen, wenn das Unternehmen sie benötigt.
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. Die ASP.NET -Boilerplate -Vorlage verwendet auch die Log4Net -Protokollbibliothekskomponente. Wir implementieren jedoch die Log4NET -Abhängigkeitsinjektion in nur einer Zeile von Schlüsselcode (speziell in der folgenden Konfigurationsdatei erläutert). Daher ist es auch einfach, es durch Ihre eigene Protokollkomponente zu ersetzen.
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 uns zuerst mit dem Logger -Objekt -Logger auseinandersetzen. Das ASP.NET -Boilerplate -Framework verwendet die Abhängigkeitsinjektionstechnologie der Abhängigkeitsinjektion und wir können die Abhängigkeitsinjektion problemlos verwenden, um den Logger -Objekt -Logger zu generieren.
Schauen wir uns anschließend an, wie ASP.NET -Boilerplate die Protokollierungsfunktion implementiert:
mit Castle.core.logging; // 1: Der Namespace zum Importieren des Protokolls. 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; Satz; } public TaskAppService () {// 3: Wenn es keinen Logger gibt, geben Sie den Protokoll in eine leere Instanz zurück und schreiben Sie das Protokoll nicht. 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; } public void createTask (createTaskInput input) {// 4: Schreiben Sie an logger.info ("Erstellen einer neuen Aufgabe mit Beschreibung:" + input.Description); // Todo: Aufgabe in der Datenbank speichern ...}} 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 enthält die Basisklassen von MVC -Controllern, Web -API -Controllern und Anwendungsdienstklassen (die von Ihnen definierten Controller und Anwendungsdienste müssen die Basisklassen von ASP.NET -Kesselplatten erben. Mit anderen Worten, wenn Ihre angepassten Web -API -Controller, MVC -Controller und Anwendungsdienstklassen, in denen die Basis -Klassen entsprechende Basis -Klassen entsprechende Basis -Klassen, in den Basisklassen, in den Basisklassen, in den Basis -Loga -Basis -Rahmeneinrichtungen.
public class homecontroller: SimplyTasSystemControllerBase {public actionResult index () {logger.debug ("Eine Beispielprotokollnachricht ..."); return view (); }}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" Typ = "log4net.Appender.RollingFileAppender"> <Datei value = "logs /logs.txt" /> <appendToFile Wert = " /> <rollingstyle =" /> <Rollingstyle = " /> <" /> <rollingstyle = " /> <" /> <" /> <" /> <" /> <" /> <" /> <" /> <" /> <" /> <" /> <" /> <" /> <" /> <" /> <". /> <maximumFileSize value = "10000KB" /> <staticLogFileName value = "true" /> <layout type Ref = "RollingFileAppender" /> <Level Value = "Debug" /> < /root> <logger name = "nhiberNate"> <Level Value = "Warn" /> < /logger> < /log4net>
Log4Net ist eine sehr leistungsstarke und benutzerfreundliche Protokollbibliothekskomponente. Sie können verschiedene Protokolle schreiben, z. B. das Schreiben in TXT -Dateien, das Schreiben in Datenbanken usw. Sie können die minimale Protokollebene genau wie die obige Konfiguration für NHiNRNATE 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.ioccontainer.addfacility <LoggingFacility> (f => f.uselog4net (). Withconfig ("log4Net.config"); Base.Application_Start (Absender, e); }}Einige Zeilen von Code Call Log4NET, die Protokollierungskomponente. Die Log4Net -Bibliothek im Projekt befindet sich im Nuget -Paket. Sie können es auch in andere Protokollkomponentenbibliotheken ändern, der Code muss jedoch nicht geändert werden. 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: Client JavaScript -API. Was Sie hier erklären müssen, ist, dass Sie Console.log verwenden können, um Protokolle im Client auszugeben. Diese API unterstützt jedoch nicht unbedingt alle Browser und kann Ausnahmen von Ihrem Skript verursachen. Sie können unsere API verwenden, unsere ist sicher und Sie können diese APIs sogar überladen oder erweitern.
abp.log.debug ('...'); abp.log.info ('...'); abp.log.warn ('...'); abp.log.Error ('...'); Abp.Log.fatal ('...'); abp.log.fatal ('...');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:
public class MySettingProvider : SettingProvider{ public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context) { return new[] { new SettingDefinition( "SmtpServerAddress", "127.0.0.1" ), new SettingDefinition( "PassiveUsersCanNotLogin", "true", Scopes: SetingScopes.Application |. }}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> (); Der Einstellungsanbieter registriert automatisch die Abhängigkeitsinjektion. 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 Einstellbereich für "Anwendung | Mieter | Benutzer" definieren und versuchen, den Wert des aktuell festgelegten Standes zu erhalten;
• 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:
// Abrufen eines booleschen Wertes (Async Call) var value1 = Await SettingManager.GetSettingValueEsync <bool> ("Passiveuserscannotlogin"); // Abrufen eines String -Wertes (Sync Call) var value2 = SettingManager.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 curr CurrentColor = abp.Setting.get ("SiteColorPreference"); Es gibt auch Methoden wie Getint und Getboolean. 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.
Das obige ist eine detaillierte Einführung in die grundlegende Konfiguration des Protokollmanagements und der Einstellungsverwaltung im ABP -Framework, das vom Editor des Fooxin Technology Channel zusammengestellt wurde. Ich hoffe, es wird für alle hilfreich sein, dieses Wissen zu erlernen. Für weitere Inhalte achten Sie bitte weiter auf den Fooxin -Technologiekanal!