Skip to main content

Multiorganización

Visión general​

Crono puede alojar varias organizaciones independientes con una sola base de código y aplicación (multi-tenant). Cada organización puede operar con su propio host, sus configuraciones, sus catálogos maestros y sus datos, aislados entre sí. El sistema mapea cada solicitud entrante a la organización correspondiente y, si no hay coincidencia, aplica la organización predeterminada.

Resolución del inquilino (host)​

La organización activa se determina a partir del host de la solicitud mediante el resolvedor de inquilino:

  • IInquilinoResolver es el contrato; SubDominioInquilinoResolver resuelve la organización a partir del subdominio/host.
  • El InquilinoResolverMiddleware ejecuta la resolución en el pipeline (después de los archivos estáticos, para que JS/CSS/imágenes no pasen por la validación) y presenta una página de error personalizada cuando el host no corresponde a ninguna organización.

Contexto de organización​

La organización activa se obtiene desde IOrganizacionContexto:

var organizacion = _organizacionContexto.OrganizacionActual;

También expone OrganizacionActualIdSiModoMultiOrganizacion, que devuelve 0 en modo de organización única o el Id de la organización activa en modo multi-organización.

Entidades restringidas por organización​

Las entidades pueden acotarse a una organización implementando:

  • IOrganizacionRestringida: la entidad pertenece a una organización pero puede compartirse/consultarse con reglas de restricción.
  • IOrganizacionUnica: la entidad pertenece a una única organización.

La asignación y el filtrado de la organización son automáticos gracias a los interceptores OrganizacionInterceptor, OrganizacionUnicaInterceptor y OrganizacionRestringidaInterceptor (ver Interceptores). Para cargar de la base de datos solo los registros de la organización actual, usa la extensión de consulta AplicarFiltroOrganizacion.

Configuraciones por organización​

La mayoría de los valores de configuración admiten variación por organización. Al cargar o guardar una configuración se indica el identificador de la organización; cuando es 0, el valor aplica de forma global. Las clases de configuración pueden inyectarse directamente (el contenedor resuelve la instancia de la organización activa) y las acciones MVC usan los atributos CargarConfiguracion / GuardarConfiguracion para resolver y persistir automáticamente (ver Configuración).