Configuración
Marco de configuración de aplicaciones
Resumen
Configurar una aplicación generalmente se realiza por el usuario a través de la interfaz de usuario de Configuración/Configuraciones en el backend. Los formularios opcionales son proporcionados por cada módulo para garantizar la validez de los datos y prevenir cambios no deseados. En el nivel más bajo, cada ajuste individual es simplemente un registro en la base de datos representado por la entidad Configuracion
. Su valor se almacena como texto plano en el campo Valor
.
Para facilitar el manejo, los ajustes se agrupan y combinan en clases POCO. Aquí algunos ejemplos:
ImpuestoConfiguraciones
TemaConfiguraciones
MedioConfiguraciones
ClienteConfiguraciones
Concepto técnico
Cada clase de configuración necesita implementar la interfaz IConfiguraciones
y debe tener un constructor público sin parámetros. Cada propiedad en la clase representa un ajuste individual cuyo nombre en la base de datos es una combinación del nombre de la clase y el nombre de la propiedad. Esto significa que la propiedad TemaPredeterminado
en la clase TemaConfiguraciones
sería: TemaConfiguraciones.TemaPredeterminado
.
El valor de la configuración en la base de datos es la representación en cadena del valor de la propiedad, lo que significa que el tipo de la propiedad debe ser convertible hacia y desde una cadena. Solo las propiedades públicas con un getter y un setter son elegibles como configuraciones persistentes. Todas las demás propiedades (o miembros en general) se ignoran.
Las entradas de configuración son compatibles con múltiples organizaciones, y el valor de una entrada puede sobrescribirse opcionalmente a nivel de organización.
No utilices tipos complejos para las propiedades de configuración.
Sin embargo, si es absolutamente necesario, crea un convertidor de tipos para tu tipo y regístralo.
Acceso a configuraciones
Mediante inyección de dependencias
El patrón más simple y ampliamente utilizado para acceder a las configuraciones es pasarlas como dependencias. Una fuente especial de registro de componentes registra dinámicamente todas las clases que implementan IConfiguraciones
como dependencias de tipo singleton.
No actualices las propiedades de las configuraciones de manera programática.
Dado que las clases de configuración son singletons, los cambios realizados persistirán mientras la aplicación esté en ejecución o hasta que se limpie la caché. Sin embargo, si es absolutamente necesario, guarda los cambios (ver más abajo).
Mediante IConfiguracionFabrica
El singleton IConfiguracionFabrica
es responsable de activar y poblar instancias de clases de configuración que implementan IConfiguraciones
.
El método para cargar configuraciones es CargarConfiguracionesAsync<TConfiguraciones>()
. Intenta cargar TConfiguraciones
para una organización específica desde la caché o, si no está en caché, desde la base de datos.
De manera similar, el método para guardar configuraciones es GuardarConfiguracionesAsync<TConfiguraciones>()
. Guarda una instancia de configuración para una organización específica en la base de datos.
Acceso a entradas individuales de configuración
También puedes acceder a entradas individuales utilizando el servicio IConfiguracionServicio
.
Actualizar entradas individuales invalida automáticamente la caché de las clases. Por ejemplo, todas las instancias de TemaConfiguraciones
se eliminan de la caché cuando la entrada TemaConfiguraciones.TemaPredeterminado
se actualiza o elimina.
Tutorial
El siguiente código muestra cómo proporcionar configuraciones personalizadas con un editor completo habilitado para múltiples organizaciones. También incluye código útil para un módulo de herramientas de desarrollo.
Crear la clase de configuración
Crear el modelo de configuración
Aunque no es obligatorio, separar la interfaz de usuario de las capas de aplicación es una buena práctica. Crea un modelo de vista para PerfiladorConfiguraciones
con este propósito.
Crear vista
Crear acciones del controlador
Decora la acción GET
con el atributo CargarConfiguracion
y la acción POST
con el atributo GuardarConfiguracion
. Aunque no son obligatorios, estos atributos te ahorrarán escribir código tedioso y repetitivo.
El atributo CargarConfiguracion
resuelve automáticamente todos los parámetros de clase de configuración (en este caso, PerfiladorConfiguraciones
) desde la inyección de dependencias y los pasa al método. Si se especifica, el parámetro int organizacionAmbito
también se llenará automáticamente con el ID de la organización actual.
El atributo GuardarConfiguracion
realiza básicamente lo mismo, incluyendo:
Actualizar los parámetros del modelo según el alcance de la organización actual, omitiendo las propiedades que no se hayan sobrescrito.
Guardar la instancia de configuración en la base de datos.
Crear un elemento de menú
Existen muchas maneras de enlazar tu página de configuraciones en el backend.
Last updated