Système de plugins

Étendre le visualiseur avec des plugins

Le cœur de Doconut reste léger ; les fonctionnalités optionnelles sont livrées sous forme de plugins — des packages NuGet séparés qui apportent des visualiseurs ou des services et sont activés par votre licence. Cette page explique le modèle d’enregistrement, le fonctionnement du contrôle de licence à l’exécution, et comment intégrer votre propre visualiseur.

Enregistrement d'un plugin

Chaque package de plugin expose une classe de plugin. Vous l’enregistrez une fois, au démarrage :

csharp
builder.Services.AddDoconut(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});

AddPlugin<TPlugin>() instancie le plugin et invoque son rappel Register sur le registre de plugins détenu par DoconutOptions. Tout ce qu’un plugin apporte est étiqueté avec la capacité requise du plugin. AddDoconut() valide immédiatement les plugins enregistrés : une licence manquante, un fichier TRIAL hérité, ou une licence payante sans la capacité entraîne un échec du démarrage avec InvalidOperationException. Un enregistrement Temporaire/Démo est conservé au-delà de l’expiration, mais ses capacités d’exécution sont révoquées après la date d’expiration.

Le contrat

Un plugin implémente une interface volontairement petite :

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
}

Dans Register, le constructeur accepte deux types de contributions :

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — un visualiseur pour une extension de fichier,
  • builder.RegisterService<TContract>(() => …) — un service typé que d’autres parties du pipeline peuvent rechercher.

Capacités et contrôle

Les capacités sont les unités de licence. Converter et Dicom sont fournis comme plugins optionnels ; Search et Annotation sont des fonctionnalités intégrées contrôlées de la même façon. Le visualiseur de base n’est pas une capacité — c’est le prérequis, exposé sous la forme IsViewerLicensed dans le service de licence.

La validation au démarrage empêche normalement un plugin non licencié d’entrer dans le pipeline de requêtes. La fabrique de visualiseurs applique également deux règles d’exécution défensives, importantes si les droits changent après le démarrage :

  • Le plugin remplace un visualiseur intégré (un plugin revendique une extension que le registre intégré gère également) : si la capacité est licenciée, le visualiseur du plugin l’emporte ; sans elle, Doconut revient silencieusement au visualiseur intégré. Les utilisateurs voient toujours leur document — ils n’obtiennent simplement pas la fonctionnalité du plugin.
  • Format uniquement plugin (par ex. .dcm — DICOM n’a pas de visualiseur intégré) : sans la capacité, l’appel d’ouverture échoue brutalement :
text
LicenseException: This document type requires the 'Dicom' plugin license.

Une licence Temporaire active accorde toutes les capacités (avec une visualisation de base propre et sans filigrane). C’est une source classique de surprises lors du lancement : enregistrer les mêmes plugins avec une licence achetée qui omet l’une de leurs capacités fait échouer AddDoconut() au démarrage. Comparez IsCapabilityGranted(...) avec votre plan avant le déploiement. L’inverse : avec aucune licence du tout, rien n’est accordé — une licence manquante n’est pas une licence Temporaire.

Le même contrôle apparaît côté client : Viewer.ReferenceScripts() et ReferenceCss() émettent les bundles de scripts/styles pour les fonctionnalités contrôlées par licence (recherche, annotation, …) uniquement lorsque la licence les active, de sorte que l’interface du widget reste cohérente avec ce que le serveur fera réellement.

Carte des fonctionnalités et des plugins

L’interface du produit utilise « plugin » comme libellé de fonctionnalité large, mais l’enregistrement côté serveur diffère :

FonctionnalitéComment elle est activéeCapacitéContribue
AnnotationIntégré au visualiseur ; inclut les ressources d’annotationAnnotationÉdition dans le navigateur, persistance de session et exportations incrustées
SearchIntégré aux visualiseurs de formats recherchables ; inclut les ressources de recherche et active l’extraction lorsque nécessaireSearchIndex texte natif, surlignages et navigation des résultats
ConverterInstallez Doconut.NET8.Converter et enregistrez ConverterPluginConverterService de conversion C# et widget web optionnel
DICOMInstallez Doconut.NET8.Dicom et enregistrez DicomPluginDicomVisualisation d’images médicales pour .dcm et .ima

Packages de plugins publiés

PluginPackageCapacitéContribue
ConverterDoconut.NET8.ConverterConverterCapacité de conversion de documents
DICOMDoconut.NET8.DicomDicomVisualisation d’images médicales (.dcm — format uniquement plugin)

Chacun possède une page dédiée sous Plugins avec sa configuration et son utilisation.

Visualiseurs personnalisés — votre propre gestionnaire de format

Vous pouvez brancher un visualiseur dans le pipeline sans écrire de package de plugin, directement depuis Program.cs :

text
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // implements IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // optional default config
});

Les visualiseurs personnalisés ont la priorité sur tout — intégrés et plugins confondus — et ne sont pas soumis au contrôle de licence (c’est votre code). La fabrique revient à un ImageConfig lorsque vous ne fournissez pas de configuration par défaut.

Points clés

  • Les plugins sont enregistrés explicitement et leur LicenseCapability est validé pendant AddDoconut() — une autorisation manquante ou insuffisante non temporaire échoue rapidement.
  • Les plugins de type remplacement se dégradent gracieusement ; les formats uniquement plugin échouent avec une LicenseException.
  • Une licence Temporaire active débloque tout ; la licence de production débloque ce que vous avez acheté. Vérifiez avec IDoconutLicenseService avant la mise en production.

Cette page vous a-t-elle été utile ?