插件系统

使用插件扩展查看器

Doconut 的核心保持精简;可选功能以 插件 的形式提供——独立的 NuGet 包,贡献查看器或服务,并由您的许可证启用。本页解释注册模型、许可证限制在运行时的行为,以及如何插入您自己的查看器。

此模型在本次发布中是全新的。之前的 .NET Standard 库没有插件注册表:转换功能位于查看器本身,插件许可证通过静态 Viewer.SetLicensePlugin(...) 调用进行安装。在这里,这两者都不是注册机制。

注册插件

每个插件包都会公开一个插件类。您只需在启动时注册一次:

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

AddPlugin<TPlugin>() 实例化插件并调用其 Register 回调,对位于 DoconutOptions 上的插件注册表进行操作。插件贡献的所有内容都会标记为插件的 必需功能。AddDoconut() 会立即验证已注册的插件:缺少许可证、旧版 TRIAL 文件,或付费许可证缺少该功能,都会导致启动时出现 InvalidOperationException。临时/演示注册在到期后仍会保留,但其运行时功能会在到期日后被撤销。

合约

插件实现了一个刻意简小的接口:

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // 例如 "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // 许可证入口
    void Register(IDoconutPluginBuilder builder); // 贡献查看器/服务
}

在 Register 中,构建器接受两种类型的贡献:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — 针对文件扩展名的查看器,
  • builder.RegisterService<TContract>(() => …) — 供管道其他部分查找的类型化服务。

功能和限制

功能是许可证的计量单位。Converter 和 Dicom 作为可选插件提供;Search 和 Annotation 是以相同方式受限的内置功能。基础查看器 不是 功能——它是前置条件,在许可证服务上以 IsViewerLicensed 形式公开。

启动时的验证通常会阻止未授权的插件进入请求管道。查看器工厂还会应用两条防御性运行时规则,这在启动后授权发生变化时尤为重要:

  • 插件覆盖内置查看器(插件声明了一个内置注册表也处理的扩展名):如果已授权该功能,插件查看器优先;如果未授权,Doconut 会静默回退到内置查看器。用户仍然可以看到文档——只是没有插件功能。
  • 仅插件格式(例如 .dcm —— DICOM 没有内置查看器):如果未授权该功能,打开调用会直接失败:
text
LicenseException: This document type requires the 'Dicom' plugin license.

有效的临时许可证会授予所有功能(并提供干净、未加水印的基础查看)。这常常是上线时的惊喜来源:使用缺少某项功能的已购许可证注册相同插件会导致 AddDoconut() 在启动时失败。部署前请将 IsCapabilityGranted(...) 与您的计划进行比较。相反,如果根本没有许可证,则不会授予任何功能——缺少许可证并不等同于临时许可证。

相同的限制也会在客户端出现:Viewer.ReferenceScripts() 和 ReferenceCss() 会为许可证受限的功能(搜索、注释,…)仅在 许可证启用时生成脚本/样式包,从而使小部件的 UI 与服务器实际行为保持一致。

功能与插件映射

产品 UI 将 “插件” 作为宽泛的功能标签使用,但服务器注册方式不同:

功能启用方式功能贡献
Annotation内置于查看器;包括注释资源Annotation浏览器创作、会话持久化以及嵌入式导出
Search内置于可搜索格式的查看器;包括搜索资源并在需要时启用提取Search原生文本索引、高亮显示和结果导航
Converter安装 Doconut.NETStandard.Converter 并注册 ConverterPluginConverterC# 转换服务和可选的网页小部件
DICOM安装 Doconut.NETStandard.Dicom 并注册 DicomPluginDicom针对 .dcm 和 .ima 的医学图像查看

注释和普通搜索不使用 AddPlugin<TPlugin>();只有在许可证授予相应功能时才会生成它们的包。Converter 和 DICOM 是此文档集的已发布可选 IDoconutPlugin 实现。

已批准的 .NET Standard 构件包含 Doconut.NETStandard.Converter 和 Doconut.NETStandard.Dicom,版本与核心包相同。

已发布的插件包

插件包功能贡献
ConverterDoconut.NETStandard.ConverterConverter文档转换功能
DICOMDoconut.NETStandard.DicomDicom医学图像查看(.dcm — 仅插件格式)

每个插件在 插件 下都有专属页面,提供其配置和使用方法。

自定义查看器 — 您自己的格式处理器

您可以直接从 Program.cs 将查看器插入管道,而无需编写插件包:

csharp
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // 实现 IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // 可选默认配置
});

自定义查看器优先于 所有 — 包括内置和插件 — 并且不受许可证限制(它们是您的代码)。如果未提供默认配置,工厂会回退到 ImageConfig。

要点

  • 插件需显式注册,其 LicenseCapability 在 AddDoconut() 期间进行验证 — 缺少或不足的非临时授权会快速失败。
  • 覆盖式插件会优雅降级;仅插件格式会因 LicenseException 而失败。
  • 有效的临时许可证会解锁所有功能;正式许可证只解锁您购买的功能。发布前请使用 IDoconutLicenseService 进行验证。

此页面对您有帮助吗?