Gestion des journaux
Côté serveur (côté serveur)
ASP.NET BULERPLAY utilise l'outil de journalisation de l'installation de journalisation de Castle Windsor et peut utiliser différentes bibliothèques de classes de journaux, telles que: log4net, nlog, seleLog ... et ainsi de suite. Pour toutes les bibliothèques de classes de journaux, Castle fournit une interface générale pour l'implémenter.
Note du traducteur: What Is Castle: Castle est un projet open source pour la plate-forme .NET, du framework d'accès aux données ORM aux conteneurs IOC, au framework MVC et AOP sur la couche Web, il comprend essentiellement tout dans l'ensemble du processus de développement. Le conteneur IOC de ASP.NET BULERPLAY est implémenté via Castle.
Log4NET est le composant de la bibliothèque de journaux le plus populaire sous ASP.NET. .
Obtenir un bûcheron
Quel que soit le composant Log Library que vous choisissez, il est le même pour la connexion via le code. (La plainte ici, l'interface universelle d'Ilogger de Castle est vraiment géniale).
Passons au sujet: (Note du traducteur: Le code suivant est l'analyse du code source Castle.Core et la mise en œuvre du framework ABP)
1. Tout d'abord, nous devons d'abord faire face à l'enregistrement des objets en bûcheron.
Ensuite, jetons un coup d'œil à la façon dont ASP.NET BULERPLAY implémente la fonction de journalisation:
Utilisation de Castle.Core.logging; Ici, nous définissons d'abord un enregistreur de propriété publique de type Ilogger, qui est l'objet que nous utilisons pour enregistrer les journaux. Après avoir créé l'objet TaskAppService (la tâche définie dans notre application), elle est implémentée par injection d'attribut. Public Ilogger Logger {get; set;} public taskAppservice () {// 3: S'il n'y a pas de journal C'est le meilleur moyen d'implémenter l'injection de dépendance, // Si vous ne définissez pas cette bûcheron vide, une exception sera générée lorsque nous obtiendrons la référence de l'objet et l'instancions. // Cela garantit que l'objet n'est pas vide. Ainsi, en d'autres termes, sans configurer un enregistreur, le journal ne sera pas enregistré et un objet nul sera renvoyé. // L'objet Nulllogger n'est en fait rien, vide. Ce n'est qu'en faisant cela que nous pouvons nous assurer que les classes que nous définissons fonctionnent normalement lorsqu'elles sont instanciées. Logger = nulllogger.instance;} public void CreateTask (CreateTaskInput Input) {// 4: Écrivez dans le journal logger.info (créant une nouvelle tâche avec description: + input.deScription); }} La copie de code est la suivante:Info 2014-07-13 13: 40: 23,360 [8] Simpletasksystem.tasks.taskAppService - Création d'une nouvelle tâche avec description: N'oubliez pas de boire du lait avant de dormir!
Après avoir écrit dans le journal, nous pouvons afficher le fichier journal, tout comme le format suivant:
Utilisation de Logger via la classe de baseLe framework ASP.NET BULERPLAY fournit les classes de base des contrôleurs MVC, des contrôleurs API Web et des classes de services d'application (les services de contrôleur et d'application que vous définissez vous-même doivent hériter des classes de base du chaudr-plaque ASP.NET. En d'autres termes, lorsque vous le personnalisez. Les contrôleurs API Web, les contrôleurs MVC et les classes de services d'application héritent toutes les classes de base correspondant au framework ASP.NET BULERPLAY, vous pouvez donc utiliser directement le journaliste).
classe publique HomeController: SimpletAsksystemControllerBase {public ActionResult Index () {Logger.Debug (un exemple de message de journal ...);Description: SimpletAskSystemControllerBase Ce contrôleur de classe de base est le contrôleur de classe de base que nous nous définissons, et il doit hériter d'AbpController.
De cette façon, l'enregistreur peut fonctionner normalement. Bien sûr, vous pouvez également implémenter votre propre classe de base, afin que vous ne puissiez plus utiliser l'injection de dépendance.
Configuration
Si vous générez votre projet via des modèles ASP.NET BULERPLATS sur le site officiel, toutes les configurations de Log4NET sont générées automatiquement.
Le format de configuration par défaut est le suivant:
• Niveau de journal: niveau d'enregistrement du journal, 5 débogage, informations, avertissement, erreur ou mortel.
• Date et heure: heure de journalisation.
• Numéro de thread: le numéro de thread lorsque chaque ligne de journal est écrite.
• Nom du journal: le nom de l'enregistreur, généralement le nom de classe.
• Texte du journal: le contenu du journal que vous avez écrit.
Fichier de configuration: log4net.config est généralement situé dans le répertoire Web du projet.
<? xml version = 1.0 Encoding = utf-8?> <log4net> <appender name = rollingFileAppender type = log4net.appender.rollingFileAPpender> <file value = logs / logs.txt /> <appendtofile value = true /> <rollingstyle value = Size /> <maxsizerollbackups value = 10 /> <maximumFileSize value = 10000kb /> <staticLogFileName value = true /> <Layout type = log4net.layout.patternlayout> <ConversionPattern Value =% - 5Level% Date [% -5.5Thread]% -40.40Logger -% Message% newline /> </ Layout> </ Appender> <hoot> <appender-ref Ref = RollingFileAPPender /> <Niveau Value = Debug /> </ root> <logger name = nhibernate> <niveau de valeur = warn /> </ogrogger> </ogram4net>
Log4NET est un composant de bibliothèque de journaux très puissant et facile à utiliser. Vous pouvez définir le niveau de journal minimum, tout comme la configuration ci-dessus pour nhibernate. Différents bûcheurs d'écriture écrivent différents journaux, etc.
Pour une utilisation spécifique, veuillez vous référer à: http://logging.apache.org/log4net/release/config-examples.html
Enfin, dans le fichier global.asax du projet, définissez le fichier de configuration log4net:
classe publique mvcapplication: abpwebapplication {protected override void application_start (expéditeur d'objet, eventArgs e) {iocmanager.instance.iocContainer.Addfactility <logingfactility> (f => f.uselog4net (). withconfig (log4net.config)); expéditeur, e);}Quelques lignes d'appel de code LOG4NET, le composant de journalisation. Parce que, notre cadre implémente l'enregistreur par injection de dépendance!
Côté client (client)
Enfin, ce qui est encore plus étonnant, c'est que vous pouvez également appeler l'enregistreur du côté client. Côté client, le framework ASP.NET BULERPLAY a une API JavaScript JavaScript correspondante, ce qui signifie que vous pouvez enregistrer les journaux du navigateur, et le code d'implémentation est le suivant:
abp.log.warn («Un exemple de message de journal ...»);
Attaché: l'API JavaScript client, ce que vous devez expliquer ici, c'est que vous pouvez utiliser Console.log pour sortir des journaux sur le client, mais cette API ne prend pas nécessairement la prise en charge de tous les navigateurs et peut provoquer des exceptions à votre script. API, la nôtre est sûre et vous pouvez même surcharger ou étendre ces API.
abp.log.debug ('...'); abp.log.info ('...'); abp.log.warn ('...'); abp.log.error ('...' );Gestion des paramètres
introduire
Chaque application doit stocker certains paramètres et les utiliser quelque part dans l'application. Le framework ABP fournit une infrastructure puissante que nous pouvons définir sur le serveur ou le client pour stocker / obtenir des configurations d'application, de locataire et de niveau utilisateur.
Les paramètres sont généralement stockés dans une base de données (ou une autre source), représentée par la structure correspondant à la chaîne de valeurs de nom. Nous pouvons convertir les valeurs non corrigées en valeurs de chaîne pour le stockage.
Remarque: à propos de l'interface Isettingstore
Afin d'utiliser la gestion des paramètres, l'interface IsettingStore doit être implémentée. Vous pouvez l'implémenter à votre manière, et il existe des implémentations complètes dans le projet Module-Zero à laquelle vous référer.
Définir les paramètres
Vous devez définir les paramètres avant de les utiliser. Le cadre ABP est une conception modulaire, donc différents modules peuvent avoir des paramètres différents. Pour définir les paramètres du module, chaque module doit créer une classe dérivée héritée de SettingProvider. L'exemple du fournisseur de configuration est le suivant:
classe publique MySettingProvider: SettingProvider {public Override Ienumeable <SettingDefinition> GetSettingDefinitions (settingDeFinitionProviderContex ) , Nouveau paramètres de définition ( SiteColorPreference, Red, Scopes: SettingScopes.User, IsVisibletOclices: true)};La méthode GetSettingDefinitions renvoie l'objet SettingDefinition. Le constructeur de la classe SettingDefinition a les paramètres suivants:
• Nom (requis): doit avoir un nom unique sur l'ensemble du système. Une meilleure façon consiste à définir les constantes de chaîne pour définir le nom.
• Valeur par défaut: définit une valeur par défaut. Cette valeur peut être nul ou une chaîne vide.
• Scopes: définit la portée du paramètre (voir ci-dessous).
• Nom d'affichage: une chaîne localisable pour afficher plus tard le nom défini dans l'interface utilisateur.
• Description: une chaîne localisable pour afficher plus tard la description des paramètres dans l'interface utilisateur.
• Groupe: peut être utilisé pour configurer des groupes. Ce n'est que pour l'interface utilisateur et n'est pas pour définir la gestion.
• IsVisibletOclices: Le réglage sur true rendra les paramètres disponibles sur le client.
Après avoir créé le paramètres de set
Configuration.settings.providers.add <mySettingProvider> (); Par conséquent, le fournisseur de configuration peut injecter toutes les dépendances (telles qu'un référentiel) pour générer une autre source de la définition de configuration.
Définir la plage
Il y a trois paramètres (ou niveaux) définis dans l'énumération de SettingScopes:
• Application: les paramètres à l'échelle de l'application sont utilisés pour les paramètres indépendants de l'utilisateur / locataire. Par exemple, nous pouvons définir un paramètre appelé SmtPServerAddress qui obtient l'adresse IP du serveur lors de l'envoi d'un e-mail. Si ce paramètre a une seule valeur (non modifiée en fonction de l'utilisateur), nous pouvons le définir comme portée d'application.
• Locataire: si l'application est multi-locataire, nous pouvons définir des paramètres spécifiques au locataire.
• Utilisateur: Nous pouvons utiliser les paramètres à l'échelle de l'utilisateur pour stocker / obtenir des valeurs définies pour chaque utilisateur.
L'énuo de paramètres a une propriété Flags, nous pouvons donc définir un paramètre avec plusieurs lunettes.
La gamme des paramètres est hiérarchique. Par exemple, si nous définissons la plage de paramètres à l'application | Utilisateur |
• Nous obtenons la valeur d'un utilisateur spécifique s'il définit (réécrit) l'utilisateur.
• Sinon, nous obtenons la valeur spécifique du locataire si elle définit (réécriture) le locataire.
• Sinon, nous obtenons la valeur de l'application si elle définit l'application.
• Sinon, nous obtenons la valeur par défaut.
La valeur par défaut peut être nul ou une chaîne vide. Si possible, il est recommandé de fournir une valeur par défaut pour les paramètres.
Obtenez la valeur définie
Après avoir défini les paramètres, nous pouvons obtenir sa valeur actuelle sur le serveur et le client.
(1) côté serveur
ISettingManager est utilisé pour effectuer des paramètres. Nous pouvons l'injecter et l'utiliser n'importe où dans l'application. ISettingManager définit de nombreuses méthodes pour obtenir des valeurs définies.
La méthode la plus couramment utilisée est GetSettingValue (ou GetSettingValueAsync est un appel asynchrone). Il renvoie la valeur actuellement définie en fonction de la plage par défaut, application, locataire et paramètres utilisateur (comme décrit dans le paragraphe avant la plage de définition). exemple:
// Obtenir une valeur booléenne (appel asynchronisé) Var Value1 = Await SettingManager.getSettingValueAsync <bool> (passiveUsersCannotLogin); // Obtenir une valeur de chaîne (Sync Call) Var Value2 = SettingManager.GetSettingValue (SmTPServerAddress);
GetSettingValue a des versions génériques et asynchrones, comme indiqué ci-dessus. Il existe également des moyens d'obtenir une liste de paramètres pour un locataire ou un utilisateur spécifique ou tous les paramètres.
Étant donné que iSettingManager est largement utilisé, certaines classes de base spécifiques (telles que Applications Service, DomainService et AbpController) ont une propriété appelée SettingManager. Si nous héritons de ces classes, il n'est pas nécessaire de l'injecter explicitement.
(2) Client
Si IsVisibletOclices est défini sur true lors de la définition des paramètres, vous pouvez obtenir sa valeur actuelle à l'aide de JavaScript sur le client. ABP.setting L'espace de noms définit les fonctions et objets requis. Exemple:
var currentColor = abp.setting.get (SiteColorPreference); Vous pouvez utiliser l'objet ABP.Setting.Values pour obtenir toutes les valeurs. Notez que si vous modifiez les paramètres du côté serveur, le client ne connaît pas cette modification à moins que la page ne soit actualisée ou rechargée d'une manière ou d'une autre ou mise à jour manuellement via le code.
Modifier les paramètres
ISettingManager définit les modifications changeants pour laapplicationaSync, changettingFortenantAsync et changeSettingForUserAsync (et la version synchrone) pour modifier séparément les paramètres de l'application, du locataire et de l'utilisateur.
À propos du cache
Le cache est dans la gestion des paramètres côté serveur, nous ne devons donc pas utiliser directement l'instruction du référentiel ou de la base de données pour modifier la valeur définie.