Plugin-System

Erweitern Sie den Viewer mit Plugins

Der Kern von Doconut bleibt schlank; optionale Funktionalität wird als Plugins bereitgestellt — separate NuGet‑Pakete, die Viewer oder Services beitragen und durch Ihre Lizenz aktiviert werden. Diese Seite erklärt das Registrierungsmodell, wie das Lizenz‑Gating zur Laufzeit funktioniert und wie Sie Ihren eigenen Viewer einbinden.

Registrieren eines Plugins

Jedes Plugin‑Paket stellt eine Plugin‑Klasse bereit. Sie registrieren sie einmalig beim Start:

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

AddPlugin<TPlugin>() instanziiert das Plugin und ruft dessen Register‑Callback im Plugin‑Register auf, das in DoconutOptions gehalten wird. Alles, was ein Plugin beiträgt, wird mit der erforderlichen Fähigkeit des Plugins markiert. AddDoconut() validiert registrierte Plugins sofort: Eine fehlende Lizenz, eine veraltete TRIAL‑Datei oder eine kostenpflichtige Lizenz ohne die Fähigkeit führen beim Start zu einer InvalidOperationException. Eine Temporäre/Demo‑Registrierung bleibt über das Ablaufdatum hinaus erhalten, aber ihre Laufzeit‑Fähigkeiten werden nach dem Ablaufdatum widerrufen.

Der Vertrag

Ein Plugin implementiert ein bewusst kleines Interface:

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
}

Innerhalb von Register akzeptiert der Builder zwei Arten von Beiträgen:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — ein Viewer für eine Dateierweiterung,
  • builder.RegisterService<TContract>(() => …) — ein typisierter Service, den andere Teile der Pipeline abrufen können.

Fähigkeiten und Gating

Fähigkeiten sind die Lizenz‑Einheiten. Converter und Dicom werden als optionale Plugins bereitgestellt; Search und Annotation sind integrierte Funktionen, die auf die gleiche Weise gegatet werden. Der Basis‑Viewer ist keine Fähigkeit — er ist die Voraussetzung, die als IsViewerLicensed im Lizenz‑Service bereitgestellt wird.

Die Start‑Validierung verhindert normalerweise, dass ein nicht lizenziertes Plugin in die Anforderungspipeline gelangt. Die Viewer‑Factory wendet außerdem zwei defensive Laufzeitregeln an, die wichtig sind, wenn sich das Anrecht nach dem Start ändert:

  • Plugin überschreibt einen integrierten Viewer (ein Plugin beansprucht eine Erweiterung, die das integrierte Register ebenfalls verarbeitet): Mit lizensierter Fähigkeit gewinnt der Plugin‑Viewer; ohne sie fällt Doconut stillschweigend auf den integrierten Viewer zurück. Benutzer sehen ihr Dokument weiterhin — sie erhalten jedoch nicht die Plugin‑Funktion.
  • Nur‑Plugin‑Format (z. B. .dcm — DICOM hat keinen integrierten Viewer): Ohne die Fähigkeit schlägt der Öffnungsaufruf hart fehl:
text
LicenseException: This document type requires the 'Dicom' plugin license.

Eine aktive Temporäre Lizenz gewährt jede Fähigkeit (mit sauberer, nicht wasserzeichen‑behafteter Basisansicht). Dies ist eine klassische Quelle für Überraschungen beim Go‑Live: Das Registrieren derselben Plugins mit einer gekauften Lizenz, die eine ihrer Fähigkeiten weglässt, lässt AddDoconut() beim Start fehlschlagen. Vergleichen Sie IsCapabilityGranted(...) mit Ihrem Plan, bevor Sie bereitstellen. Das Gegenstück: Ohne jegliche Lizenz wird nichts gewährt — eine fehlende Lizenz ist keine Temporäre Lizenz.

Das gleiche Gating erscheint clientseitig: Viewer.ReferenceScripts() und ReferenceCss() erzeugen die Skript‑/Style‑Bundles für die lizenzgesteuerten Funktionen (Suche, Annotation, …) nur wenn die Lizenz sie aktiviert, sodass die UI des Widgets konsistent mit dem bleibt, was der Server tatsächlich tut.

Funktions‑ und Plugin‑Übersicht

Die Produkt‑UI verwendet „Plugin“ als breiten Funktionsbegriff, aber die Server‑Registrierung unterscheidet sich:

FunktionWie es aktiviert wirdFähigkeitBeiträgt
AnnotationIn den Viewer integriert; Annotationsressourcen einbeziehenAnnotationBrowser‑Autorierung, Sitzungs‑Persistenz und eingebettete Exporte
SearchIn durchsuchbare Format‑Viewer integriert; Suchressourcen einbeziehen und Extraktion dort aktivieren, wo erforderlichSearchNativer Text‑Index, Hervorhebungen und Ergebnisnavigation
ConverterInstallieren Sie Doconut.NET6.Converter und registrieren Sie ConverterPluginConverterC#‑Konvertierungsservice und optionales Web‑Widget
DICOMInstallieren Sie Doconut.NET6.Dicom und registrieren Sie DicomPluginDicomBetrachtung medizinischer Bilder für .dcm und .ima

Annotation und die normale Suche verwenden nicht AddPlugin<TPlugin>(); ihre Bundles werden nur erzeugt, wenn die Lizenz die entsprechende Fähigkeit gewährt. Converter und DICOM sind die veröffentlichten optionalen IDoconutPlugin‑Implementierungen für dieses Dokumentationsset.

Die freigegebenen .NET‑6‑Artefakte enthalten Doconut.NET6.Converter und Doconut.NET6.Dicom in derselben Version wie das Kern‑Paket.

Veröffentliche Plugin‑Pakete

PluginPaketFähigkeitBeiträgt
ConverterDoconut.NET6.ConverterConverterDokumentkonvertierungs‑Fähigkeit
DICOMDoconut.NET6.DicomDicomBetrachtung medizinischer Bilder (.dcm — nur‑Plugin‑Format)

Jedes hat eine eigene Seite unter Plugins mit seiner Konfiguration und Nutzung.

Benutzerdefinierte Viewer — Ihr eigener Format‑Handler

Sie können einen Viewer in die Pipeline einbinden, ohne ein Plugin‑Paket zu schreiben, direkt aus Program.cs:

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

Benutzerdefinierte Viewer haben Vorrang vor allen — integrierten und Plugin‑basierten — und sind nicht lizenzgesteuert (sie sind Ihr Code). Die Factory greift auf ein ImageConfig zurück, wenn Sie keine Standard‑Konfiguration bereitstellen.

Fazit

  • Plugins werden explizit registriert und ihre LicenseCapability wird während AddDoconut() validiert — fehlende oder unzureichende nicht‑temporäre Berechtigung schlägt sofort fehl.
  • Override‑Plugins degradieren elegant; nur‑Plugin‑Formate schlagen mit einer LicenseException fehl.
  • Eine aktive Temporäre Lizenz schaltet alles frei; die Produktions‑Lizenz schaltet das frei, was Sie gekauft haben. Überprüfen Sie dies mit IDoconutLicenseService vor dem Ausliefern.

War diese Seite hilfreich?