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 ajoutent des visualiseurs ou des services et sont activés par votre licence. Cette page explique le modèle d'enregistrement, ce qui se passe au démarrage lorsqu'une licence ne couvre pas un plugin, et comment intégrer votre propre visualiseur.

Enregistrement d'un plugin

Chaque package de plugin expose une classe de plugin. Enregistrez‑le une fois, dans Application_Start :

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});
// Un plugin enregistré dont la licence est manquante lance ici, dans Application_Start, et le
// le site répond alors à chaque requête avec un 500 vide. La raison se trouve dans le journal d'événements Windows.

AddPlugin<TPlugin>() crée le plugin et lui permet d'enregistrer ses contributions avec DoconutOptions. Tout ce qu'un plugin contribue est étiqueté avec la capacité requise du plugin, et DoconutHost.Initialize vérifie chaque plugin enregistré par rapport à la licence avant que le site ne traite sa première requête.

Une licence de plugin manquante arrête le site

Lorsque aucune licence active n'accorde la capacité d'un plugin enregistré — aucune licence du tout, un fichier TRIAL hérité, ou une licence payante sans cette capacité — DoconutHost.Initialize lance InvalidOperationException depuis Application_Start :

text
The Converter plugin is registered via AddPlugin but no active license grants Converter.
Remove the AddPlugin<...>() call or install a license (or trial/demo) that includes Converter.

Dans System.Web, une exception dans Application_Start ne génère pas de page d'erreur. Chaque requête renvoie un 500 vide, le journal IIS n'affiche rien d'utile, et le message apparaît uniquement dans le journal d'événements Windows (journal Application, source ASP.NET). Lorsqu'un site cesse de répondre juste après l'ajout d'une ligne AddPlugin, vérifiez d'abord les fichiers de licence dans wwwroot — voir Configuration de licence.

Le contrat

Un plugin implémente une interface délibérément petite :

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // par ex. "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // la porte de licence
    void Register(IDoconutPluginBuilder builder); // contribuer aux visionneurs/services
}

À l'intérieur de Register, le constructeur accepte deux types de contribution :

  • 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é comme IsViewerLicensed sur 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 de défense, qui sont importantes si les droits changent pendant l'exécution du site :

  • Un plugin qui remplace un visualiseur intégré (il revendique une extension qu'un visualiseur intégré gère également) : avec la capacité licenciée, le visualiseur du plugin l'emporte ; sans elle, Doconut revient au visualiseur intégré. Les utilisateurs voient toujours leur document ; ils n'obtiennent simplement pas le comportement du plugin.
  • Un format uniquement disponible via plugin (.dcm et .ima — DICOM n'a pas de visualiseur intégré) : sans la capacité, l'ouverture échoue :
text
LicenseException: This document type requires the 'Dicom' plugin license.

Une licence Temporaire active accorde toutes les capacités. C'est une surprise classique lors du passage en production : les mêmes lignes AddPlugin qui ont fonctionné pendant l'évaluation arrêtent le site lorsque la licence achetée omet l'une de ces capacités. Comparez IsCapabilityGranted(...) avec ce que vous avez acheté avant le déploiement. Avec aucune licence du tout, rien n'est accordé — une licence manquante n'est pas une licence Temporaire.

Le même filtrage atteint le navigateur : Viewer.ReferenceScripts() et ReferenceCss() émettent les fichiers pour les fonctionnalités filtrées par licence (Recherche, Annotation) uniquement lorsque la licence les accorde, ainsi la page ne propose jamais une fonctionnalité que le serveur refusera.

Carte des fonctionnalités et des plugins

FonctionnalitéComment elle est activéeCapacitéContribue
AnnotationIntégré au visualiseur ; inclut les ressources d'annotationAnnotationCréation dans le navigateur, persistance de session, exportations incrustées
RechercheIntégré aux visualiseurs de formats recherchables ; inclut les ressources de rechercheSearchIndex texte natif, surlignages, navigation des résultats
ConvertisseurInstallez Doconut.NETFramework.Converter et enregistrez ConverterPluginConverterService de conversion C# et un widget web optionnel
DICOMInstallez Doconut.NETFramework.Dicom et enregistrez DicomPluginDicomVisualisation d'images médicales pour .dcm et .ima

L'Annotation et la Recherche n'utilisent pas AddPlugin<TPlugin>(). Le Convertisseur et DICOM ont chacun une page sous Plugins avec leur configuration et utilisation. Dans ce package, DICOM rend les pages, les cadres et les animations, mais ne lit pas les métadonnées techniques — voir Plugin DICOM.

Visualiseurs personnalisés — votre propre gestionnaire de format

Vous pouvez brancher un visualiseur dans le pipeline sans écrire de package de plugin, directement dans Application_Start :

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),                        // implémente IFormatViewer
        () => new ImageConfig { ImageResolution = 150 });  // config par défaut optionnel
});

Les visualiseurs personnalisés ont la priorité sur tout — les intégrés et les plugins — et ne sont pas filtrés par licence : ils sont votre code. Lorsque vous ne fournissez aucune configuration par défaut, la fabrique utilise un ImageConfig.

Points clés

  • Les plugins sont enregistrés explicitement dans DoconutHost.Initialize, et leurs capacités sont validées à cet endroit ; un droit manquant arrête le site avec un 500 vide dont la raison se trouve dans le journal d'événements Windows.
  • Les plugins de type remplacement se dégradent gracieusement ; les formats uniquement disponibles via plugin échouent avec un 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 était-elle utile ?