Skip to main content

Resolvedor de enlaces (LinkResolver)

Crono guarda los destinos de navegación como expresiones de enlace compactas (por ejemplo entidad:123, url:~/ruta o https://ejemplo.com). IEnlaceResolucion traduce esas expresiones a URLs y etiquetas concretas, respetando la seguridad por organización y roles, y reutilizando resultados de una caché en memoria.

Formato de la expresión

Una expresión de enlace tiene la forma esquema:objetivo|destino?consulta:

ParteDescripción
esquemaIdentificador que selecciona un proveedor (url, file, o esquemas de entidad). Si se omite, la cadena se trata como una URL.
objetivoId de entidad, nombre de sistema o ruta de URL.
destinoVentana destino opcional (por ejemplo _blank).
consultaCadena de consulta opcional que se añade al enlace generado.

La expresión se analiza con EnlaceExpresion.Analizar(...).

Resolver enlaces

Inyecta IEnlaceResolucion y llama a ResolverAsync con la expresión:

public class DemoEnlace
{
private readonly IEnlaceResolucion _enlaces;

public DemoEnlace(IEnlaceResolucion enlaces) => _enlaces = enlaces;

public async Task<string> ObtenerEnlaceAsync(int id)
{
var resultado = await _enlaces.ResolverAsync($"entidad:{id}");
return resultado.Estado == EnlaceEstado.Ok ? resultado.Enlace : string.Empty;
}
}

ResolverAsync(expresion, roles, idiomaId, organizacionId) devuelve un EnlaceResultadoResolucion con la URL final, una etiqueta localizada y los identificadores de entidad cuando aplican. El control de acceso (organización y roles) se evalúa antes de considerar válido un enlace.

Proveedores personalizados

Se añaden esquemas nuevos implementando IEnlaceProveedor y registrándolo por inyección de dependencias. Cada proveedor declara su Esquema, un Orden y el método TraducirAsync(EnlaceExpresion, organizacionId, idiomaId) que resuelve la URL/etiqueta. Los metadatos del proveedor controlan además el selector de enlaces en el backend.

Invalidación de caché

Los enlaces resueltos se cachean con una clave que incluye esquema, organización, idioma y roles. Cuando la entidad subyacente cambia, invalida la caché:

_enlaceResolucion.InvalidarEnlace("entidad", entidadId);

Los elementos de menú aprovechan este resolvedor para traducir sus expresiones a URLs al renderizarse (ver Menús).