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).