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 können.
Dieses Modell ist in dieser Version neu. Die vorherige .NET‑Standard‑Bibliothek hatte kein Plugin‑Register: Die Konvertierung war im Viewer selbst integriert und Plugin‑Lizenzen wurden über statische Viewer.SetLicensePlugin(...)‑Aufrufe installiert. Keines davon ist hier ein Registrierungsmechanismus.
Registrieren eines Plugins
Jedes Plugin‑Paket stellt eine Plugin‑Klasse bereit. Sie registrieren sie einmalig beim Start:
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 auf DoconutOptions gehalten wird. Alles, was ein Plugin beiträgt, wird mit der erforderlichen Fähigkeit des Plugins versehen. AddDoconut() validiert registrierte Plugins sofort: Eine fehlende Lizenz, eine veraltete TRIAL‑Datei oder eine bezahlte Lizenz ohne die Fähigkeit führen beim Start zu einem Fehler mit 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 eine bewusst kleine Schnittstelle:
public interface IDoconutPlugin
{
string Name { get; } // z. B. "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // das Lizenztor
void Register(IDoconutPluginBuilder builder); // Beitragen zu Viewern/Diensten
}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 nachschlagen können.
Fähigkeiten und Gating
Fähigkeiten sind die Lizenz‑Einheiten. Converter und Dicom werden als opt‑in‑Plugins bereitgestellt; Search und Annotation sind integrierte Funktionen, die auf dieselbe Weise gesteuert werden. Der Basis‑Viewer ist nicht eine 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): Ist die Fähigkeit lizenziert, 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:
LicenseException: This document type requires the 'Dicom' plugin license.Eine aktive Temporäre Lizenz gewährt jede Fähigkeit (mit sauberer, nicht wasserzeichenbehafteter Basisansicht). Das 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: Mit überhaupt keiner 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 bleibt mit dem, was der Server tatsächlich tut.
Funktions‑ und Plugin‑Übersicht
Die Produkt‑UI verwendet „Plugin“ als breiten Funktionsbegriff, aber die Server‑Registrierung unterscheidet sich:
| Funktion | Wie es aktiviert wird | Fähigkeit | Beiträgt |
|---|---|---|---|
| Annotation | In den Viewer integriert; Annotation‑Ressourcen einbeziehen | Annotation | Browser‑Autorierung, Sitzungs‑Persistenz und eingebettete Exporte |
| Search | In durchsuchbaren Format‑Viewern integriert; Such‑Ressourcen einbeziehen und Extraktion aktivieren, wo erforderlich | Search | Nativer Text‑Index, Hervorhebungen und Ergebnis‑Navigation |
| Converter | Installieren Sie Doconut.NETStandard.Converter und registrieren Sie ConverterPlugin | Converter | C#‑Konvertierungsservice und optionales Web‑Widget |
| DICOM | Installieren Sie Doconut.NETStandard.Dicom und registrieren Sie DicomPlugin | Dicom | Medical‑Image‑Anzeige für .dcm und .ima |
Annotation und reguläre 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 opt‑in‑IDoconutPlugin‑Implementierungen für dieses Dokumentationsset.
Die genehmigten .NET‑Standard‑Artefakte enthalten Doconut.NETStandard.Converter und
Doconut.NETStandard.Dicom in derselben Version wie das Kernpaket.
Veröffentliche Plugin‑Pakete
| Plugin | Paket | Fähigkeit | Beiträgt |
|---|---|---|---|
| Converter | Doconut.NETStandard.Converter | Converter | Dokumentkonvertierungs‑Fähigkeit |
| DICOM | Doconut.NETStandard.Dicom | Dicom | Medical‑Image‑Anzeige (.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 von Program.cs:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // implementiert IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // optionale Standardkonfiguration
});Benutzerdefinierte Viewer haben Vorrang vor allen — integrierten und Plugins gleichermaßen — und sind nicht lizenzgesteuert (sie sind Ihr Code). Die Factory greift auf ein ImageConfig zurück, wenn Sie keine Standardkonfiguration bereitstellen.
Fazit
- Plugins werden explizit registriert und ihr
LicenseCapabilitywird währendAddDoconut()validiert — fehlende oder unzureichende nicht‑temporäre Berechtigung schlägt schnell fehl. - Override‑Plugins degradieren elegant; Nur‑Plugin‑Formate scheitern mit einem
LicenseException. - Eine aktive Temporäre Lizenz schaltet alles frei; die Produktionslizenz schaltet das frei, was Sie gekauft haben. Überprüfen Sie mit
IDoconutLicenseServicevor dem Versand.
War diese Seite hilfreich?