プラグインシステム

プラグインでビューアを拡張する

Doconut のコアはスリムなままです;オプション機能は プラグイン — ビューアやサービスを提供する別個の NuGet パッケージで、ライセンスに応じて有効になります。このページでは登録モデル、ランタイム時のライセンスゲーティングの動作、そして独自のビューアをプラグインする方法を説明します。

プラグインの登録

各プラグインパッケージは 1 つのプラグインクラスを公開します。起動時に一度だけ登録します。

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

AddPlugin<TPlugin>() はプラグインをインスタンス化し、DoconutOptions に保持されているプラグインレジストリに対してその Register コールバックを呼び出します。プラグインが提供するすべてはプラグインの 必要な機能 でタグ付けされます。AddDoconut() は登録されたプラグインを直ちに検証します:ライセンスが欠如している、レガシー TRIAL ファイルがある、または機能がない有料ライセンスの場合、InvalidOperationException で起動が失敗します。一時的/デモ登録は有効期限を超えて保持されますが、ランタイムの機能は有効期限後に取り消されます。

契約

プラグインは意図的に小さなインターフェイスを実装します:

csharp
public interface IDoconutPlugin
{
    string Name { get; }                          // 例: "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // ライセンスゲート
    void Register(IDoconutPluginBuilder builder); // ビューア/サービスに貢献する
}

Register の内部では、ビルダーは 2 種類の貢献を受け入れます:

  • builder.RegisterViewer(".dcm", () => new DicomViewer()) — ファイル拡張子用のビューア、
  • builder.RegisterService<TContract>(() => …) — パイプラインの他の部分が参照できる型付きサービス。

機能とゲーティング

機能はライセンス単位です。Converter と Dicom はオプトインプラグインとして提供されます;Search と Annotation は同様にゲートされる組み込み機能です。ベースビューアは機能ではありません — それは前提条件であり、ライセンスサービス上で IsViewerLicensed として公開されます。

起動時の検証は通常、ライセンスのないプラグインがリクエストパイプラインに入るのを防ぎます。ビューアファクトリはさらに 2 つの防御的ランタイムルールを適用します。これは、起動後に権利が変更された場合に重要です:

  • プラグインが組み込みビューアを上書きする(プラグインが組み込みレジストリでも処理される拡張子を主張する場合):機能がライセンスされていれば、プラグインビューアが優先されます;ライセンスがない場合、Doconut は静かに組み込みビューアにフォールバックします。ユーザーは依然としてドキュメントを見ることができますが、プラグイン機能は利用できません。
  • プラグイン専用フォーマット(例: .dcm — DICOM には組み込みビューアがありません):機能がない場合、オープン呼び出しはハードに失敗します:
text
LicenseException: This document type requires the 'Dicom' plugin license.

アクティブな一時的ライセンスはすべての機能を付与します(クリーンで透かしのないベースビューイング)。これは本番稼働時の驚きの典型的な原因です:機能の一つが欠けた購入済みライセンスで同じプラグインを登録すると、AddDoconut() が起動時に失敗します。デプロイ前に IsCapabilityGranted(...) をプランと比較してください。逆に、ライセンスが全くない場合、何も付与されません — ライセンスが欠如していることは一時的ライセンスではありません。

同じゲーティングがクライアント側にも現れます:Viewer.ReferenceScripts() と ReferenceCss() は、ライセンスが有効なときのみ、ライセンスでゲートされた機能(検索、注釈、…)のスクリプト/スタイルバンドルを出力し、ウィジェットの UI はサーバーが実際に行うことと一貫性を保ちます。

機能とプラグインのマップ

製品 UI は「プラグイン」を広範な機能ラベルとして使用しますが、サーバー側の登録は異なります:

機能有効化方法機能貢献内容
Annotationビューアに組み込まれており、注釈リソースを含みますAnnotationブラウザでの作成、セッション永続化、そして埋め込みエクスポート
Search検索可能なフォーマットビューアに組み込まれており、検索リソースを含み、必要に応じて抽出を有効にしますSearchネイティブテキストインデックス、ハイライト、結果ナビゲーション
ConverterDoconut.NET6.Converter をインストールし、ConverterPlugin を登録ConverterC# 変換サービスとオプションのウェブウィジェット
DICOMDoconut.NET6.Dicom をインストールし、DicomPlugin を登録Dicom.dcm と .ima 用の医療画像ビューイング

Annotation と通常の Search は AddPlugin<TPlugin>() を使用しません;それらのバンドルは、対応する機能がライセンスで付与されたときのみ出力されます。Converter と DICOM は、このドキュメントセット向けにリリースされたオプトイン IDoconutPlugin 実装です。

承認された .NET 6 アーティファクトには、コアパッケージと同じバージョンの Doconut.NET6.Converter と Doconut.NET6.Dicom が含まれています。

リリースされたプラグインパッケージ

プラグインパッケージ機能貢献内容
ConverterDoconut.NET6.ConverterConverterドキュメント変換機能
DICOMDoconut.NET6.DicomDicom医療画像ビューイング(.dcm — プラグイン専用フォーマット)

各プラグインは プラグイン の下に専用ページがあり、構成と使用方法が記載されています。

カスタムビューア — 独自のフォーマットハンドラ

プラグインパッケージを書かずに、Program.cs から直接ビューアをパイプラインにプラグインできます:

csharp
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // IFormatViewer を実装
        () => new ImageConfig { ImageResolution = 150 }); // オプションのデフォルト設定
});

カスタムビューアは すべて よりも優先されます — 組み込みとプラグインの両方 — そしてライセンスでゲートされません(それらはあなたのコードです)。デフォルト設定を提供しない場合、ファクトリは ImageConfig にフォールバックします。

要点

  • プラグインは明示的に登録され、その LicenseCapability は AddDoconut() 中に検証されます — 欠如または一時的でない権利が不十分な場合は速やかに失敗します。
  • オーバーライドスタイルのプラグインは優雅に劣化します;プラグイン専用フォーマットは LicenseException で失敗します。
  • アクティブな一時的ライセンスはすべてをアンロックします;本番環境は購入したものだけをアンロックします。出荷前に IDoconutLicenseService で確認してください。

このページは役に立ちましたか?