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 :
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 :
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 :
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ée | Capacité | Contribue |
|---|---|---|---|
| Annotation | Intégré au visualiseur ; inclut les ressources d’annotation | Annotation | Édition dans le navigateur, persistance de session et exportations incrustées |
| Search | Intégré aux visualiseurs de formats recherchables ; inclut les ressources de recherche et active l’extraction lorsque nécessaire | Search | Index texte natif, surlignages et navigation des résultats |
| Converter | Installez Doconut.NET8.Converter et enregistrez ConverterPlugin | Converter | Service de conversion C# et widget web optionnel |
| DICOM | Installez Doconut.NET8.Dicom et enregistrez DicomPlugin | Dicom | Visualisation d’images médicales pour .dcm et .ima |
Packages de plugins publiés
| Plugin | Package | Capacité | Contribue |
|---|---|---|---|
| Converter | Doconut.NET8.Converter | Converter | Capacité de conversion de documents |
| DICOM | Doconut.NET8.Dicom | Dicom | Visualisation 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 :
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
LicenseCapabilityest validé pendantAddDoconut()— 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
IDoconutLicenseServiceavant la mise en production.
Cette page vous a-t-elle été utile ?