Sistema de Plugins

Amplía 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 con su licencia. Esta página explica el modelo de registro, cómo funciona la limitación de licencia 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 e invoca su callback Register 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, archivo legacy TRIAL, o licencia paga sin la capacidad provoca 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:

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // p. ej. "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // la puerta de licencia
    void Register(IDoconutPluginBuilder builder); // contribuir visualizadores/servicios
}

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 opt-in; 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 importan 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 solo 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 en absoluto, 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 script/estilo para las funciones limitadas por licencia (búsqueda, anotación, …) solo cuando la licencia las habilita, de modo que la UI del widget permanezca consistente con lo que el servidor realmente hará.

Mapa de características y plugins

La UI del producto usa “plugin” como una etiqueta amplia de característica, pero el registro del servidor difiere:

FunciónCómo se habilitaCapacidadContribuye
AnotaciónIntegrado en el visor; incluye recursos de anotaciónAnnotationCreación en el navegador, persistencia de sesión y exportaciones incrustadas
BúsquedaIntegrado 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
ConvertidorInstalar 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 usan AddPlugin<TPlugin>(); sus paquetes se emiten solo cuando la licencia otorga la capacidad correspondiente. Convertidor y DICOM son las implementaciones opt-in IDoconutPlugin 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
ConvertidorDoconut.NET6.ConverterConverterCapacidad de conversión de documentos
DICOMDoconut.NET6.DicomDicomVisualización de imágenes médicas (.dcm — formato solo 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:

csharp
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // implementa IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // configuración predeterminada opcional
});

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 solo de plugin fallan con un LicenseException.
  • Una licencia Temporal activa desbloquea todo; la producción desbloquea lo que compró. Verifique con IDoconutLicenseService antes de lanzar.

¿Fue útil esta página?