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 fournissent des visualiseurs ou des services et sont activés par votre licence. Cette page explique le modèle d’enregistrement, le fonctionnement du filtrage de licence à l’exécution, et comment brancher 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é provoquent un échec du démarrage avec InvalidOperationException. Un enregistrement Temporaire/Démo est conservé après 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
}

À l’intérieur de 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 filtrage

Les capacités sont les unités de licence. Converter et Dicom sont livrés comme plugins optionnels ; Search et Annotation sont des fonctionnalités intégrées filtrées de la même manière. 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, qui sont 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) : avec la capacité 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 aucun 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’autre côté : avec aucune licence du tout, rien n’est accordé — une licence manquante n’est pas une licence Temporaire.

Le même filtrage apparaît côté client : Viewer.ReferenceScripts() et ReferenceCss() émettent les bundles de scripts/styles pour les fonctionnalités filtré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 un libellé de fonctionnalité large, mais l’enregistrement côté serveur diffère :

FonctionnalitéMode d’activationCapacitéContribue
AnnotationIntégré au visualiseur ; inclut les ressources d’annotationAnnotationCréation dans le navigateur, persistance de session et exportations incorporées
SearchIntégré aux visualiseurs de formats recherchables ; inclut les ressources de recherche et active l’extraction lorsque nécessaireSearchIndex de texte natif, surlignages et navigation des résultats
ConverterInstallez Doconut.NET6.Converter et enregistrez ConverterPluginConverterService de conversion C# et widget web optionnel
DICOMInstallez Doconut.NET6.Dicom et enregistrez DicomPluginDicomVisualisation d’images médicales pour .dcm et .ima

L’annotation et la recherche normale n’utilisent pas AddPlugin<TPlugin>() ; leurs bundles sont émis uniquement lorsque la licence accorde la capacité correspondante. Converter et DICOM sont les implémentations IDoconutPlugin optionnelles publiées pour cet ensemble de documentation.

Les artefacts .NET 6 approuvés contiennent Doconut.NET6.Converter et Doconut.NET6.Dicom à la même version que le package de base.

Packages de plugins publiés

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

Chaque 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 — les intégrés et les plugins — et ne sont pas filtrés par 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 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 ?