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 su licencia. Esta página explica el modelo de registro, cómo funciona la limitación de licencias en tiempo de ejecución y cómo conectar su propio visor.
Registrando un plugin
Cada paquete de plugin expone una clase de plugin. La registra una vez, al iniciar:
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 Register callback contra el registro de plugins mantenido en DoconutOptions. Todo lo que un plugin aporta está etiquetado con la capacidad requerida del plugin. AddDoconut() valida los plugins registrados inmediatamente: una licencia faltante, un archivo TRIAL heredado, o una licencia paga sin la capacidad provocan que el inicio 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 expiración.
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 requisito previo, 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 son importantes si los derechos cambian después del inicio:
- 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 retrocede silenciosamente al visor integrado. Los usuarios aún ven su documento — simplemente no obtienen la función del plugin.
- Formato exclusivo de plugin (p. ej.,
.dcm— DICOM no tiene visor integrado): sin la capacidad la llamada de apertura falla de forma crítica:
LicenseException: This document type requires the 'Dicom' plugin license.Una licencia Temporal activa otorga todas las capacidades (con visualización base limpia y sin marcas de agua). Esta 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 inicio. Compare IsCapabilityGranted(...) con su plan antes de desplegar. Por otro lado: con ninguna licencia, 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() generan 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 se mantiene 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 del servidor difiere:
| Función | Cómo se habilita | Capacidad | Contribuye |
|---|---|---|---|
| Annotation | Incorporado en el visor; incluye recursos de anotación | Annotation | Creación en el navegador, persistencia de sesión y exportaciones incrustadas |
| Search | Incorporado en visores de formatos buscables; incluye recursos de búsqueda y habilita la extracción donde sea necesario | Search | Índice de texto nativo, resaltados y navegación de resultados |
| Converter | Instalar Doconut.NET6.Converter y registrar ConverterPlugin | Converter | Servicio de conversión C# y widget web opcional |
| DICOM | Instalar Doconut.NET6.Dicom y registrar DicomPlugin | Dicom | Visualización de imágenes médicas para .dcm y .ima |
La anotación y la búsqueda normal no utilizan AddPlugin<TPlugin>(); sus paquetes se generan solo cuando la licencia otorga la capacidad correspondiente. Converter y DICOM son las implementaciones IDoconutPlugin opcionales lanzadas para este conjunto de documentación.
Los artefactos aprobados de .NET 6 contienen Doconut.NET6.Converter y Doconut.NET6.Dicom en la misma versión que el paquete central.
Paquetes de plugins lanzados
| Plugin | Paquete | Capacidad | Contribuye |
|---|---|---|---|
| Converter | Doconut.NET6.Converter | Converter | Capacidad de conversión de documentos |
| DICOM | Doconut.NET6.Dicom | Dicom | Visualización de imágenes médicas (.dcm — formato exclusivo de plugin) |
Cada uno tiene una página dedicada bajo Plugins con su configuración y uso.
Visores personalizados — su propio manejador de formato
Puede conectar un visor al pipeline sin escribir 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 precedencia sobre todo — tanto los integrados como los plugins — y no están limitados por licencia (son su código). La fábrica recurre a un ImageConfig cuando no proporciona una configuración predeterminada.
Conclusiones
- Los plugins se registran explícitamente y su
LicenseCapabilityse valida duranteAddDoconut()— la falta o insuficiencia de derechos no temporales falla rápidamente. - Los plugins de estilo sobrescritura se degradan de forma elegante; los formatos exclusivos de plugin fallan con una
LicenseException. - Una licencia Temporal activa desbloquea todo; la licencia de producción desbloquea lo que compró. Verifique con
IDoconutLicenseServiceantes de lanzar.
¿Fue útil esta página?