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 :
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 :
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 :
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’activation | Capacité | Contribue |
|---|---|---|---|
| Annotation | Intégré au visualiseur ; inclut les ressources d’annotation | Annotation | Création dans le navigateur, persistance de session et exportations incorporées |
| Search | Intégré aux visualiseurs de formats recherchables ; inclut les ressources de recherche et active l’extraction lorsque nécessaire | Search | Index de texte natif, surlignages et navigation des résultats |
| Converter | Installez Doconut.NET6.Converter et enregistrez ConverterPlugin | Converter | Service de conversion C# et widget web optionnel |
| DICOM | Installez Doconut.NET6.Dicom et enregistrez DicomPlugin | Dicom | Visualisation 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
| Plugin | Package | Capacité | Contribue |
|---|---|---|---|
| Converter | Doconut.NET6.Converter | Converter | Capacité de conversion de documents |
| DICOM | Doconut.NET6.Dicom | Dicom | Visualisation 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 :
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
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 production débloque ce que vous avez acheté. Vérifiez avec
IDoconutLicenseServiceavant la mise en production.
Cette page vous a-t-elle été utile ?