Plugin-System
Extend the viewer with 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 die Lizenzgating zur Laufzeit funktioniert und wie Sie Ihren eigenen Viewer einbinden.
Registrieren eines Plugins
Jedes Plugin‑Paket stellt eine Plugin‑Klasse bereit. Sie registrieren es einmal 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 markiert. AddDoconut() validiert registrierte Plugins sofort: Eine fehlende Lizenz, eine veraltete TRIAL‑Datei oder eine bezahlte Lizenz ohne die Fähigkeit lässt den Start mit InvalidOperationException fehlschlagen. Eine Temporary/Demo‑Registrierung bleibt über das Ablaufdatum hinweg erhalten, aber ihre Laufzeit‑Fähigkeiten werden nach dem Ablaufdatum widerrufen.
Der Vertrag
Ein Plugin implementiert ein bewusst kleines Interface:
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 optional aktivierbare Plugins bereitgestellt; Search und Annotation sind eingebaute Funktionen, die auf dieselbe Weise beschränkt 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 eingebauten Viewer (ein Plugin beansprucht eine Erweiterung, die das eingebaute Register ebenfalls behandelt): Mit lizenzierter Fähigkeit gewinnt der Plugin‑Viewer; ohne sie fällt Doconut stillschweigend auf den eingebauten Viewer zurück. Benutzer sehen ihr Dokument weiterhin — sie erhalten jedoch nicht die Plugin‑Funktion.
- Nur‑Plugin‑Format (z. B.
.dcm— DICOM hat keinen eingebauten 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). Dies ist eine klassische Quelle für Überraschungen beim Go‑Live: die gleichen Plugins mit einer gekauften Lizenz zu registrieren, die eine ihrer Fähigkeiten weglässt, führt dazu, dass AddDoconut() beim Start fehlschlägt. Vergleichen Sie IsCapabilityGranted(...) mit Ihrem Plan, bevor Sie bereitstellen. Das Gegenstück: Mit keiner Lizenz überhaupt wird nichts gewährt — eine fehlende Lizenz ist keine Temporäre Lizenz.
Die gleiche Beschränkung erscheint clientseitig: Viewer.ReferenceScripts() und ReferenceCss() geben die Skript‑/Stil‑Bundles für die lizenzgesteuerten Funktionen (Suche, Annotation, …) nur dann aus, 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:
| Funktion | Wie es aktiviert wird | Fähigkeit | Beiträgt |
|---|---|---|---|
| Annotation | In den Viewer eingebaut; beinhaltet Annotations‑Ressourcen | Annotation | Browser‑Autorierung, Sitzungs‑Persistenz und eingebettete Exporte |
| Search | In durchsuchbaren Format‑Viewern eingebaut; beinhaltet Such‑Ressourcen und ermöglicht Extraktion, wo erforderlich | Search | Nativer Text‑Index, Hervorhebungen und Ergebnis‑Navigation |
| Converter | Installieren Sie Doconut.NET8.Converter und registrieren Sie ConverterPlugin | Converter | C#‑Konvertierungsservice und optionales Web‑Widget |
| DICOM | Installieren Sie Doconut.NET8.Dicom und registrieren Sie DicomPlugin | Dicom | Betrachtung medizinischer Bilder für .dcm und .ima |
Veröffentliche Plugin‑Pakete
| Plugin | Paket | Fähigkeit | Beiträgt |
|---|---|---|---|
| Converter | Doconut.NET8.Converter | Converter | Dokumentkonvertierungs‑Fähigkeit |
| DICOM | Doconut.NET8.Dicom | Dicom | Betrachtung 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:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // implements IFormatViewer
() => new ImageConfig { ImageResolution = 150 }); // optional default config
});Benutzerdefinierte Viewer haben Vorrang vor allen — eingebauten und Plugins gleichermaßen — 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
LicenseCapabilitywird währendAddDoconut()validiert — fehlende oder unzureichende nicht‑temporäre Berechtigung führt zu einem schnellen Fehlschlag. - Override‑Plugins degradieren elegant; nur‑Plugin‑Formate schlagen mit einer
LicenseExceptionfehl. - Eine aktive Temporäre Lizenz schaltet alles frei; die Produktionslizenz schaltet das frei, was Sie gekauft haben. Überprüfen Sie dies mit
IDoconutLicenseServicevor dem Ausliefern.
War diese Seite hilfreich?