Gestión de registros
Lado del servidor (lado del servidor)
ASP.NET Boilerplate utiliza la herramienta de registro de instalaciones de registro de Castle Windsor, y puede usar diferentes bibliotecas de clases de registro, como: log4net, nlog, serilog ... etc. Para todas las bibliotecas de clase de registro, Castle proporciona una interfaz general para implementarla.
Nota del traductor: What is Castle: Castle es un proyecto de código abierto para la plataforma .NET, desde Data Access Framework Orm hasta Contenedores del COI, hasta el marco MVC y AOP en la capa web, básicamente incluye todo en todo el proceso de desarrollo. El contenedor IOC de ASP.NET Boilerplate se implementa a través de Castle.
Log4Net es el componente de biblioteca de registro más popular en ASP.NET. . Archivo), así que si desea reemplazarlo con su propio componente de registro, también es fácil.
Get Logger
Independientemente del componente de la biblioteca de registro que elija, es lo mismo para iniciar sesión a través del código. (Queja aquí, la interfaz de Ilogger Universal de Castle es realmente increíble).
Vamos al tema: (Nota del traductor: el siguiente código es el análisis de código fuente de Castle.core e implementación del marco ABP)
1. En primer lugar, primero debemos lidiar con el registrador del objeto del registrador.
A continuación, echemos un vistazo a cómo ASP.NET Boilerplate implementa la función de registro:
Uso de Castle.Core.Logging; Aquí primero definimos un registrador de propiedades públicas del tipo Ilogger, que es el objeto que usamos para grabar registros. Después de crear el objeto TaskAppService (la tarea definida en nuestra aplicación), se implementa a través de la inyección de atributos. Public Ilogger Logger {Get; Esta es la mejor manera de implementar la inyección de dependencia, // Si no define este registrador vacío, se generará una excepción cuando obtengamos la referencia del objeto y la instanciemos. // Hacerlo asegura que el objeto no esté vacío. Entonces, en otras palabras, sin configurar un registrador, el registro no se grabará y se devolverá un objeto nulo. // El objeto nulllogger en realidad no es nada, vacío. Solo al hacer esto podemos asegurarnos de que las clases que definimos el trabajo normalmente cuando se instancian. Logger = nullLogger.Instance; }} La copia del código es la siguiente:Información 2014-07-13 13: 40: 23,360 [8] SimpleTaskSystem.tasks.TaskAppService-Creación de una nueva tarea con descripción: ¡Recuerde beber leche antes de dormir!
Después de escribir en el registro, podemos ver el archivo de registro, al igual que el siguiente formato:
Uso de Logger a través de la clase baseEl marco ASP.NET Boilerplate proporciona las clases base de controladores MVC, controladores de API web y clases de servicio de aplicaciones (el controlador y los servicios de aplicaciones que define debe heredar las clases base de ASP.NET Boilerplate. En otras palabras, cuando lo personaliza. Los controladores de API web, los controladores MVC y las clases de servicio de aplicaciones heredan las clases base correspondientes al marco ASP.NET Boilerplate, por lo que puede usar directamente el registrador).
public class HomecOntroller: SimpleTaskSystemControllerBase {public ActionResult index () {logger.debug (un mensaje de registro de muestra ...);Descripción: SimpleTaskSystemControllerBase Este controlador de clase base es el controlador de clase base que definimos nosotros mismos, y debe heredar desde ABPController.
De esta manera, el registrador puede funcionar normalmente. Por supuesto, también puede implementar su propia clase base, para que ya no pueda usar la inyección de dependencia.
Configuración
Si genera su proyecto a través de las plantillas ASP.NET Boilerplate en el sitio web oficial, todas las configuraciones de LOG4Net se generan automáticamente.
El formato de configuración predeterminado es el siguiente:
• Nivel de registro: nivel de grabación de registro, 5 depuración, información, advertencia, error o fatal.
• Fecha y hora: hora de registro.
• Número de subproceso: el número de subproceso cuando se escribe cada línea de registro.
• Nombre del registrador: el nombre del registrador, generalmente el nombre de la clase.
• Texto de registro: el contenido de registro que escribió.
Archivo de configuración: log4net.config generalmente se encuentra en el directorio web del proyecto.
<? xml versión = 1.0 encoding = utf-8?> <log4net> <appender name = rollingFileAppender type = log4net.appender.rollingFileApeppender> <archivo value = logs /logs.txt /> <appendToFile value = true /> <rollingstyle value = Size /> <maxSizerOllbackUps value = 10 /> <maximumFilleize value = 10000kb /> <staticLogFileName value = true /> <diseño type = log4net.layout.patternLayout> <ConversionPathern Value = %-5 niveles de nivel de nivel [ %-5.5Thread] %-40.40Logger- %Mensaje %Newline /> </leut> </pperender> <ader> <appender-ref ref = rollingFileAppender /> <nivel valor = valor = valor = Debug/> </ Root> <logger name = nHibernate> <nivel valor = warn/> </logger> </log4net>
Log4Net es un componente de biblioteca de registro muy potente y fácil de usar. Puede establecer el nivel de registro mínimo, al igual que la configuración anterior para nHibernate. Diferentes registradores escriben diferentes registros, etc.
Para un uso específico, consulte: http://logging.apache.org/log4net/release/config-examples.html
Finalmente, en el archivo global.asax del proyecto, defina el archivo de configuración de log4net:
Clase pública MVCapplication: abpwebapplication {protegido anulación void application_start (Object Sender, EventArgs e) {iocmanager.instance.ioctontainer.addfacility <grogingFacility> (f => f.uselog4net (). conConfig (log4net.config)); remitente, e);Unas pocas líneas de código Log4Net, el componente de registro. ¡Porque nuestro marco implementa el registrador a través de la inyección de dependencia!
Lado del cliente (cliente)
Finalmente, lo que es aún más sorprendente es que también puede llamar al registrador en el lado del cliente. En el lado del cliente, el marco ASP.NET BoilerPlate tiene una API de registro JavaScript correspondiente, lo que significa que puede registrar los registros del navegador, y el código de implementación es el siguiente:
abp.log.warn ('un mensaje de registro de muestra ...');Adjunto: la API de JavaScript del cliente, lo que necesita explicar aquí es que puede usar consola.log para emitir registros en el cliente, pero esta API no es necesariamente admitente todos los navegadores y puede causar excepciones a su script. API, la nuestra es segura e incluso puede sobrecargar o extender estas API.
abp.log.debug ('...'); abp.log.info ('...'); abp.log.warn ('...'); abp.log.error ('...' ); abp.log.fatal ('...');Gestión de configuraciones
introducir
Cada aplicación necesita almacenar algunas configuraciones y usarlas en algún lugar de la aplicación. El marco ABP proporciona una infraestructura potente que podemos establecer en el servidor o el cliente para almacenar/obtener configuraciones de aplicación, inquilino y nivel de usuario.
Las configuraciones generalmente se almacenan en una base de datos (u otra fuente), representada por la estructura correspondiente a la cadena de valor de nombre. Podemos convertir los valores de no cadena en valores de cadena para el almacenamiento.
Nota: Acerca de la interfaz IsettingStore
Para utilizar la gestión de configuraciones, se debe implementar la interfaz IsettingStore. Puede implementarlo a su manera, y hay implementaciones completas en el proyecto de módulo cero para referirse.
Definir configuraciones
Debe definir la configuración antes de usarlas. El marco ABP es un diseño modular, por lo que diferentes módulos pueden tener diferentes configuraciones. Para definir la propia configuración del módulo, cada módulo debe crear una clase derivada heredada de SettingProvider. El ejemplo del proveedor de configuración es el siguiente:
public class MySettingProvider: SettingProvider {Public Override IEnumerable <SettingDefinition> GetSettingDefinitions (SettingDefinitionProviderContext context) {return new [] {New SettingDefinition (SmtPserververDdress, 127.0.0.1), New SettingDefinition ( Inquilino) , nuevo settingdefinition ( SitecolorPreference, Red, Scopes: SettingsCopes.User, ISVISIBLETOCLIENTES: TRUE)};El método GetSettingDefinitions devuelve el objeto SettingDefinition. El constructor de la clase SettingDefinition tiene los siguientes parámetros:
• Nombre (requerido): debe tener un nombre único en todo el sistema. Una mejor manera es definir constantes de cadena para establecer el nombre.
• Valor predeterminado: establece un valor predeterminado. Este valor puede ser nulo o una cadena vacía.
• Ámbos: define el alcance de la configuración (ver más abajo).
• Nombre de la pantalla: una cadena localizable para mostrar más tarde el nombre de establecimiento en la interfaz de usuario.
• Descripción: una cadena localizable para mostrar más tarde la descripción de la configuración en la interfaz de usuario.
• Grupo: se puede usar para configurar grupos. Esto es solo para uso de la interfaz de usuario y no es para establecer la gestión.
• ISVISIBLETOCLIENTS: la configuración en True hará que la configuración esté disponible en el cliente.
Después de crear el SettingProvider, debemos registrar nuestro módulo en el método de preintialización:
Configuración.settings.providers.Add <MySettingProvider> (); Por lo tanto, el proveedor de configuración puede inyectar cualquier dependencia (como un repositorio) para generar alguna otra fuente de la definición de configuración.
Establecer el rango
Hay tres configuraciones (o niveles) definidos en el Enume de los Copos de Configuración:
• Aplicación: las configuraciones de toda la aplicación se utilizan para la configuración independiente del usuario/inquilino. Por ejemplo, podemos definir una configuración llamada SMTPServerAddress que obtiene la dirección IP del servidor al enviar un correo electrónico. Si esta configuración tiene un valor único (no cambiado en función del usuario), entonces podemos definirla como alcance de la aplicación.
• Inquilino: si la aplicación es múltiple, podemos definir la configuración específica del inquilino.
• Usuario: podemos usar la configuración de todo el usuario para almacenar/obtener valores establecidos para cada usuario.
El Enume de Configuración de ENUMA tiene una propiedad de Flags, por lo que podemos definir una configuración con múltiples ámbitos.
El rango de configuración es jerárquico. Por ejemplo, si definimos el rango de configuración a la aplicación |
• Obtenemos el valor de un usuario específico si define (reescribe) al usuario.
• Si no, obtenemos el valor específico del inquilino si define (reescribe) al inquilino.
• Si no, obtenemos el valor de la aplicación si define la aplicación.
• Si no, obtenemos el valor predeterminado.
El valor predeterminado puede ser nulo o una cadena vacía. Si es posible, se recomienda proporcionar un valor predeterminado para la configuración.
Obtenga el valor establecido
Después de definir la configuración, podemos obtener su valor actual en el servidor y el cliente.
(1) Lado del servidor
IsettingManager se usa para realizar la configuración. Podemos inyectarlo y usarlo en cualquier lugar de la aplicación. IsettingManager define muchos métodos para obtener valores establecidos.
El método más utilizado es GetSettingValue (o GettingingValueasync es una llamada asíncrona). Devuelve el valor establecido actualmente en función del rango de configuración predeterminado, de aplicación, inquilino y de usuario (como se describe en el párrafo antes del rango de configuración). ejemplo:
// Obtener un valor booleano (async llamada) var valor1 = espera settingmanager.getSettingValueAsync <Bool> (pasiveUsersCannotLogin); // Obtener un valor de cadena (llamada de sincronización) var value2 = settingManager.getSettingValue (smtpServerAddressressress);
GettetingValue tiene versiones genéricas y asincrónicas, como se muestra arriba. También hay formas de obtener una lista de configuraciones para un inquilino o usuario específico o todas las configuraciones para ello.
Debido a que IsettingManager se usa ampliamente, algunas clases base específicas (como ApplationService, DomainService y ABPController) tienen una propiedad llamada SettingManager. Si heredamos de estas clases, no hay necesidad de inyectarlo explícitamente.
(2) Cliente
Si ISVISIBLETOCLIENTS se establece en verdadero al definir la configuración, puede obtener su valor actual usando JavaScript en el cliente. ABP. Establecer el espacio de nombres define las funciones y objetos requeridos. Ejemplo:
var centreColor = abp.setting.get (SitEColorPreference); Puede usar el objeto ABP.setting.Values para obtener todos los valores. Tenga en cuenta que si cambia la configuración en el lado del servidor, el cliente no sabrá sobre este cambio a menos que la página esté renovada o recargada de alguna manera o actualizada manualmente a través del código.
Cambiar la configuración
IsettingManager define cambiando la aplicación de la aplicación, los métodos de fortenantassync y Cambios de Cambios (y la versión sincrónica) para cambiar la configuración de la aplicación, el inquilino y el usuario por separado.
Sobre caché
El caché se encuentra en la administración de configuraciones del lado del servidor, por lo que no debemos usar directamente el Repositorio o la declaración de actualización de la base de datos para cambiar el valor establecido.