Sistema de Plugins
Extiende el visor con plugins
El núcleo de Doconut se mantiene ligero; la funcionalidad opcional se entrega como plugins — paquetes NuGet separados que aportan visores o servicios y se activan mediante tu licencia. Esta página explica el modelo de registro, cómo se comporta la limitación de licencia en tiempo de ejecución y cómo conectar tu propio visor.
Registro de un plugin
Cada paquete de plugin expone una clase de plugin. La registras una sola vez, al iniciar la aplicación:
builder.Services.AddDoconut(options =>
{
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});AddPlugin<TPlugin>() instancia el plugin y llama a su método Register contra el registro de plugins mantenido en DoconutOptions. Todo lo que aporta un plugin se etiqueta con la capacidad requerida del plugin. AddDoconut() valida los plugins registrados inmediatamente: una licencia faltante, un archivo TRIAL heredado o una licencia de pago sin la capacidad provocan que el arranque falle con InvalidOperationException. Un registro Temporal/Demo se conserva después de la expiración, pero sus capacidades en tiempo de ejecución se revocan tras la fecha de vencimiento.
El contrato
Un plugin implementa una interfaz deliberadamente pequeña:
public interface IDoconutPlugin
{
string Name { get; } // e.g. "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // the license gate
void Register(IDoconutPluginBuilder builder); // contribute viewers/services
}Dentro de Register, el constructor acepta dos tipos de contribuciones:
builder.RegisterViewer(".dcm", () => new DicomViewer())— un visor para una extensión de archivo,builder.RegisterService<TContract>(() => …)— un servicio tipado que otras partes del pipeline pueden buscar.
Capacidades y limitación
Las capacidades son las unidades de licencia. Converter y Dicom se entregan como plugins opcionales; Search y Annotation son funciones integradas limitadas de la misma manera. El visor base no es una capacidad — es el prerrequisito, expuesto como IsViewerLicensed en el servicio de licencias.
La validación al iniciar normalmente impide que un plugin sin licencia entre en el pipeline de solicitudes. La fábrica de visores también aplica dos reglas defensivas en tiempo de ejecución, que importan si el derecho cambia después del arranque:
- El plugin sobrescribe un visor integrado (un plugin reclama una extensión que también maneja el registro integrado): con la capacidad licenciada, el visor del plugin gana; sin ella, Doconut recurre silenciosamente al visor integrado. Los usuarios siguen viendo su documento — simplemente no obtienen la función del plugin.
- Formato exclusivo del plugin (p. ej.,
.dcm— DICOM no tiene visor integrado): sin la capacidad, la llamada de apertura falla de forma abrupta:
LicenseException: This document type requires the 'Dicom' plugin license.Una licencia Temporal activa otorga todas las capacidades (con visualización base limpia y sin marca de agua). Esto es una fuente clásica de sorpresas al lanzar: registrar los mismos plugins con una licencia comprada que omite una de sus capacidades hace que AddDoconut() falle durante el arranque. Compara IsCapabilityGranted(...) con tu plan antes de desplegar. La otra cara: sin licencia alguna, no se otorga nada — una licencia faltante no es una licencia Temporal.
La misma limitación aparece del lado del cliente: Viewer.ReferenceScripts() y ReferenceCss() emiten los paquetes de scripts/estilos para las funciones limitadas por licencia (búsqueda, anotación, …) solo cuando la licencia las habilita, de modo que la UI del widget permanezca coherente con lo que el servidor realmente hará.
Mapa de funciones y plugins
La UI del producto usa “plugin” como una etiqueta amplia de función, pero el registro en el servidor difiere:
| Función | Cómo se habilita | Capacidad | Contribuye |
|---|---|---|---|
| Annotation | Integrado en el visor; incluye recursos de anotación | Annotation | Autoría en el navegador, persistencia de sesión y exportaciones quemadas en el archivo |
| Search | Integrado en visores de formatos buscables; incluye recursos de búsqueda y habilita la extracción cuando es necesario | Search | Índice de texto nativo, resaltados y navegación de resultados |
| Converter | Instala Doconut.NET8.Converter y registra ConverterPlugin | Converter | Servicio de conversión en C# y widget web opcional |
| DICOM | Instala Doconut.NET8.Dicom y registra DicomPlugin | Dicom | Visualización de imágenes médicas para .dcm y .ima |
Annotation y Search normales no usan AddPlugin<TPlugin>(); sus paquetes se emiten solo cuando la licencia concede la capacidad correspondiente. Converter y DICOM son implementaciones IDoconutPlugin opcionales.
Paquetes de plugins publicados
| Plugin | Paquete | Capacidad | Contribuye |
|---|---|---|---|
| Converter | Doconut.NET8.Converter | Converter | Capacidad de conversión de documentos |
| DICOM | Doconut.NET8.Dicom | Dicom | Visualización de imágenes médicas (.dcm — formato exclusivo del plugin) |
Cada uno tiene una página dedicada bajo Plugins con su configuración y uso.
Visores personalizados — tu propio manejador de formatos
Puedes conectar un visor al pipeline sin crear un paquete de plugin, directamente desde Program.cs:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // implements IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // optional default config
});Los visores personalizados tienen prioridad sobre todo — integrados y plugins por igual — y no están limitados por licencia (son tu código). La fábrica recurre a un ImageConfig cuando no proporcionas una configuración predeterminada.
Conclusiones
- Los plugins se registran explícitamente y su
LicenseCapabilityse valida duranteAddDoconut()— una falta o insuficiencia de derechos no temporales provoca una falla rápida. - Los plugins de estilo sobrescritura degradan de forma elegante; los formatos exclusivos del plugin fallan con una
LicenseException. - Una licencia Temporal activa desbloquea todo; la licencia de producción desbloquea lo que compraste. Verifícalo con
IDoconutLicenseServiceantes de lanzar.
¿Fue útil esta página?