Modularidad y Proveedores
Proveedores
Un proveedor es un patrón de diseño para integrar e intercambiar una extensión de código de forma flexible. Un buen ejemplo son los métodos de autenticación externa: si se quieren implementar varios de una misma compañía, se crea un único módulo que contiene un proveedor por cada método. Además de IMetodoAutenticacionExterna, existen otras interfaces de proveedor en el sistema.
Cada una de estas interfaces de proveedor deriva de la interfaz de marcador IProveedor (Crono.Motor.Modularidad), para poder identificarlas de forma uniforme como proveedores. La clase genérica Proveedor<TProveedor> encapsula la interfaz concreta y la enriquece con propiedades generales a través de ProveedorMetadatos. Así se obtiene un constructo abstracto y cómodo, por ejemplo Proveedor<IMetodoAutenticacionExterna>:
public sealed class Proveedor<TProveedor> where TProveedor : IProveedor
{
public TProveedor Valor { get; } // La instancia del proveedor (resolución diferida)
public ProveedorMetadatos Metadatos { get; } // Sus metadatos
public bool EsValorCreado { get; }
}
Metadatos
ProveedorMetadatos describe cada proveedor. Los valores se declaran mediante atributos sobre la clase del proveedor:
| Propiedad | Se declara con | Descripción |
|---|---|---|
| NombreSistema * | NombreSistemaAttribute | Nombre único del proveedor (por ejemplo Pagos.Efectivo). |
| NombreDescriptivo | NombreDescriptivoAttribute | Nombre legible del proveedor. Localizable con la clave de recurso correspondiente. |
| Descripcion | NombreDescriptivoAttribute | Descripción del proveedor. Localizable. |
| OrdenVisualizacion | OrdenAttribute | Orden en la lista de proveedores. |
| EsConfigurable | IConfigurable | Indica si el proveedor se puede configurar. |
| EsEditable | IUsuarioEditable | Indica si los metadatos los puede editar el usuario. |
| EsOculto | EsOcultoAttribute | Indica si el proveedor está oculto. Un proveedor oculto solo se puede usar por código, no desde la interfaz. |
| MicroAplicacionesDependientes | — | Micro-aplicaciones (widgets) que se (des)activan junto con el proveedor. |
| ModuloDescriptor | — | El módulo (IModuloDescriptor) que aporta el proveedor. |
Un proveedor se puede activar o desactivar desde la lista de proveedores. Por ejemplo, un método de pago desactivado no aparece en las opciones de pago.
Administrador de proveedores
Usa IProveedorAdministrador para cargar un proveedor concreto (con sus metadatos) o todos los proveedores de un tipo determinado:
private readonly IProveedorAdministrador _proveedorAdministrador;
// Cargar un proveedor por su nombre de sistema
var proveedor = _proveedorAdministrador.ObtenerProveedor<IMetodoAutenticacionExterna>("NombreSistemaProveedor");
var metadatos = proveedor.Metadatos;
Configuración
Los proveedores configurables exponen una ruta hacia una acción de configuración. La configuración suele constar de dos métodos Configurar: uno por HttpGet para cargar los valores y otro por HttpPost para guardarlos. Como la vista de configuración es solo una porción de la página, se indica qué proveedor se está configurando a través de los metadatos y ViewBag.Proveedor:
[CargarConfiguracion]
public IActionResult Configurar(MiProveedorConfiguraciones configuraciones)
{
var modelo = MapeadorMini.Mapear<MiProveedorConfiguraciones, MiConfiguracionModelo>(configuraciones);
ViewBag.Proveedor = _proveedorAdministrador.ObtenerProveedor("NombreSistemaProveedor").Metadatos;
return View(modelo);
}
[HttpPost, GuardarConfiguracion]
public IActionResult Configurar(MiConfiguracionModelo modelo, MiProveedorConfiguraciones configuraciones)
{
if (!ModelState.IsValid)
return Configurar(configuraciones);
MapeadorMini.Mapear(modelo, configuraciones);
return RedirectToAction(nameof(Configurar));
}
Los atributos CargarConfiguracion y GuardarConfiguracion cargan y guardan automáticamente las configuraciones (ver Configuración).
Módulos
Un módulo empaqueta funcionalidad opcional (entidades, servicios, controladores, recursos de UI y proveedores). La clase base ModuloBase (Crono.Motor.Modularidad) da el punto de enganche para las fases de instalación y desinstalación del módulo; IModuloDescriptor describe el módulo y IModuloCatalogo lista los módulos instalados. La detección y actualización de los recursos de los módulos la realiza ModulosInicializador durante el arranque (ver Iniciador).