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:

csharp
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:

text
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:
text
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ónCómo se habilitaCapacidadContribuye
AnnotationIncorporado en el visor; incluye recursos de anotaciónAnnotationCreación en el navegador, persistencia de sesión y exportaciones incrustadas
SearchIncorporado en visores de formatos buscables; incluye recursos de búsqueda y habilita la extracción donde sea necesarioSearchÍndice de texto nativo, resaltados y navegación de resultados
ConverterInstalar Doconut.NET6.Converter y registrar ConverterPluginConverterServicio de conversión C# y widget web opcional
DICOMInstalar Doconut.NET6.Dicom y registrar DicomPluginDicomVisualizació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

PluginPaqueteCapacidadContribuye
ConverterDoconut.NET6.ConverterConverterCapacidad de conversión de documentos
DICOMDoconut.NET6.DicomDicomVisualizació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:

text
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 LicenseCapability se valida durante AddDoconut() — 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 IDoconutLicenseService antes de lanzar.

¿Fue útil esta página?