Plugin-system

Utöka visaren med plugins

Doconuts kärna förblir slank; valfri funktionalitet levereras som plugins — separata NuGet‑paket som bidrar med visare eller tjänster och aktiveras av din licens. Denna sida förklarar registreringsmodellen, vad som händer vid start när en licens inte täcker en plugin, och hur du ansluter din egen visare.

Registrering av en plugin

Varje plugin‑paket exponerar en plugin‑klass. Registrera den en gång, i Application_Start:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});
// En registrerad plugin vars licens saknas kastas här, i Application_Start, och den
// webbplatsen svarar sedan varje begäran med en tom 500. Anledningen finns i Windows händelseloggen.

AddPlugin<TPlugin>() skapar pluginen och låter den registrera sina bidrag med DoconutOptions. Allt som en plugin bidrar med märks med pluginens krävd funktion, och DoconutHost.Initialize kontrollerar varje registrerad plugin mot licensen innan webbplatsen hanterar sin första begäran.

En saknad plugin‑licens stoppar webbplatsen

Om ingen aktiv licens beviljar en registrerad plugins funktion — ingen licens alls, en äldre TRIAL‑fil, eller en betald licens utan den funktionen — DoconutHost.Initialize kastar InvalidOperationException från 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.

I System.Web producerar ett undantag i Application_Start ingen fel‑sida. Varje begäran svarar med en tom 500, IIS‑loggen visar inget användbart, och meddelandet visas endast i Windows‑händelseloggen (Applikationslogg, källa ASP.NET). När en webbplats slutar svara precis efter att en AddPlugin‑rad har lagts till, kontrollera licensfilerna i wwwroot först — se Licensinställning.

Kontraktet

En plugin implementerar ett avsiktligt litet gränssnitt:

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // t.ex. "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // licensporten
    void Register(IDoconutPluginBuilder builder); // bidra med viewers/services
}

Inuti Register accepterar byggaren två typer av bidrag:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — en visare för en filändelse,
  • builder.RegisterService<TContract>(() => …) — en typad tjänst som andra delar av pipeline:n kan slå upp.

Kapaciteter och gating

Kapaciteter är licensenheterna. Converter och Dicom levereras som valfria plugins; Search och Annotation är inbyggda funktioner som styrs på samma sätt. Grundvisaren är inte en kapacitet — den är förutsättningen, exponerad som IsViewerLicensed på licenstjänsten.

Startvalidering håller normalt en olicensierad plugin utanför begäran‑pipeline:n. Visarfabriken tillämpar också två defensiva regler, som är viktiga om rättigheter ändras medan webbplatsen körs:

  • En plugin som åsidosätter en inbyggd visare (den påstår en filändelse som en inbyggd visare också hanterar): med den licensierade kapaciteten vinner plugin‑visaren; utan den återgår Doconut till den inbyggda visaren. Användare ser fortfarande sitt dokument; de får bara inte plugin‑beteendet.
  • Ett format som endast stöds av plugin (.dcm och .ima — DICOM har ingen inbyggd visare): utan kapaciteten misslyckas öppningen:
text
LicenseException: This document type requires the 'Dicom' plugin license.

En aktiv Tillfällig licens beviljar varje kapacitet. Det är en klassisk överraskning vid driftsättning: samma AddPlugin‑rader som kördes under utvärderingen stoppar webbplatsen när den köpta licensen utelämnar en av dessa kapaciteter. Jämför IsCapabilityGranted(...) med vad du köpte innan du distribuerade. Med ingen licens alls, beviljas inget — en saknad licens är inte en Tillfällig licens.

Samma gating når webbläsaren: Viewer.ReferenceScripts() och ReferenceCss() levererar filerna för licensstyrda funktioner (Search, Annotation) endast när licensen beviljar dem, så sidan erbjuder aldrig en funktion som servern kommer att vägra.

Funktion- och plugin‑karta

FunktionHur den aktiverasKapacitetBidrar
AnnotationInbyggd i visaren; inkludera annoteringsresursernaAnnotationWebbläsar‑skapande, sessions‑beständighet, inbrända exporteringar
SearchInbyggd i sökbara formatvisare; inkludera sökresursernaSearchInbyggt textindex, markeringar, resultatnavigering
ConverterInstallera Doconut.NETFramework.Converter och registrera ConverterPluginConverterC#‑konverteringstjänst och en valfri webbwidget
DICOMInstallera Doconut.NETFramework.Dicom och registrera DicomPluginDicomVisning av medicinska bilder för .dcm och .ima

Annotation och Search använder inte AddPlugin<TPlugin>(). Converter och DICOM har var sin sida under Plugins med deras konfiguration och användning. I detta paket renderar DICOM sidor, ramar och animationer, men läser inte teknisk metadata — se DICOM-plugin.

Anpassade visare — din egen format‑hanterare

Du kan ansluta en visare till pipeline:n utan att skriva ett plugin‑paket, direkt i Application_Start:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),                        // implementerar IFormatViewer
        () => new ImageConfig { ImageResolution = 150 });  // valfri standard config
});

Anpassade visare har företräde framför allt — både inbyggda och plugins — och är inte licensstyrda: de är din kod. När du inte tillhandahåller någon standardkonfiguration använder fabriken en ImageConfig.

Slutsatser

  • Plugins registreras explicit i DoconutHost.Initialize, och deras kapaciteter valideras där; en saknad rättighet stoppar webbplatsen med en tom 500 vars orsak finns i Windows‑händelseloggen.
  • Plugins i överskrivningsstil degraderas smidigt; format som endast stöds av plugin misslyckas med en LicenseException.
  • En aktiv Tillfällig licens låser upp allt; produktion låser upp det du köpte. Kontrollera med IDoconutLicenseService innan du levererar.

Var den här sidan hjälpsam?