ABP es un marco de desarrollo web basado en ASP.NET. Su configuración de registro y marco también está relativamente completa. Aquí, el editor del nuevo canal de tecnología introducirá en detalle la configuración básica de la gestión de registros y la gestión de configuración en el marco ABP. ¡Los amigos necesitados pueden referirse a él con cuidado!
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 clases de registro, Castle proporciona una interfaz general para implementarla. Podemos manejar fácilmente varias bibliotecas de registro especiales, y es fácil reemplazar los componentes de registro cuando las empresas lo necesitan.
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. La plantilla ASP.NET Boilerplate también usa el componente de biblioteca de registro log4net. Sin embargo, implementamos la inyección de dependencia de Log4Net a través de una sola línea de código clave (específicamente explicado en el archivo de configuración a continuación). Por lo tanto, también es fácil reemplazarlo con su propio componente de registro.
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 Logger Object Logger. El marco ASP.NET Boilerplate utiliza la tecnología de inyección de dependencia de inyección de dependencia, y podemos usar fácilmente la inyección de dependencia para generar el registrador del objeto del registrador.
A continuación, echemos un vistazo a cómo ASP.NET Boilerplate implementa la función de registro:
usando castillo.core.logging; // 1: El espacio de nombres para importar el registro, castle.core.loggingpublic clase TaskAppService: ITaskAppService {// 2: Obtenga el objeto Logger a través de la inyección de dependencia. 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; colocar; } public taskAppService () {// 3: Si no hay registrador, devuelva el registrador a una instancia vacía y no escriba el registro. 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; } public void CreateTask (createTaskInput input) {// 4: escriba en log logger.info ("Creando una nueva tarea con descripción:" + input.description); // TODO: Guarde la tarea en la base de datos ...}} 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 (los controladores y los servicios de aplicaciones que define deben heredar las clases base de ASP.NET Boilerplate. En otras palabras, cuando sus controladores de API web personalizados, controladores MVC y las clases de servicio de aplicaciones pueden usar las clases base correspondientes a la ASP.NET Boaderplate Kilderpplate, puede utilizar directamente las clases de logro de la aplicación.
public class Homecontroller: simplTaskSystemControllerBase {public ActionResult index () {logger.debug ("Un mensaje de registro de muestra ..."); Vista de retorno (); }}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.rollingFilePepPender"> <file value = "logs /logs.txt" /> <appendToFile value = "true" /> <<rollingstyle value = "size" />>>>>> maxsizer <maximumFilesize value = "10000kb" /> <staticLogFileName value = "true" /> <Layout typee = "log4net.layout.patternLayout"> <conversionPathern value = " %-5Level %date [ %-5.5Thread] %-40.40Logger- %Mensaje %neoyline" /> </sinout> < /appender> <Root> ref = "RollingFileAppender" /> <Level Value = "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 escribir varios registros, como escribir en archivos TXT, escribir en bases de datos, etc. 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.ioccontainer.addfacility <loggingfacility> (f => f.uselog4net (). WithConfig ("log4net.config")); base.application_start (remitente, e); }}Unas pocas líneas de código Llama Log4net, el componente de registro. La biblioteca Log4Net en el proyecto está en el paquete NUGET. También puede cambiarlo a otras bibliotecas de componentes de registro, pero el código no es necesario cambiar. ¡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: Cliente API JavaScript. Lo que debe explicar aquí es que puede usar console.log para emitir registros en el cliente, pero esta API no es necesariamente admitir todos los navegadores y puede causar excepciones a su script. Puede usar nuestra 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 ('...'); 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( "SmtpServerAddress", "127.0.0.1" ), new SettingDefinition( "PassiveUsersCanNotLogin", "true", scopes: Settingscopes.application | }}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> (); El proveedor de configuración registra automáticamente la inyección de dependencia. 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 "Aplicación | Inquilino | Usuario" e intentamos obtener el valor del conjunto actualmente;
• 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 value1 = espera settingmanager.getSettingValueAsync <Bool> ("pasiveUsersCannotlogin"); // Obtener un valor de cadena (Call Sync) var value2 = settingManager.getSettingValue ("SmpPserverAddress");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 currentColor = abp.setting.get ("siteColorPreference"); También hay métodos como Getint y GetBoolean. 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.
Lo anterior es una introducción detallada a la configuración básica de la gestión de la gestión de registros y la gestión de configuraciones en el marco ABP compilado por el editor de Fooxin Technology Channel. Espero que sea útil para todos aprender este conocimiento. Para obtener más contenido, ¡continúe prestando atención al canal de tecnología Fooxin!