プラグインシステム

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

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 で起動に失敗します。Temporary/Demo の登録は有効期限が切れても保持されますが、ランタイムの機能は有効期限日以降に取り消されます。

契約

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

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.

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

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

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

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

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

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

リリース済みプラグインパッケージ

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

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

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

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

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

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

要点

  • プラグインは明示的に登録され、その LicenseCapability は AddDoconut() 中に検証されます — 欠如または一時的でない権利が不十分な場合は即座に失敗します。
  • 上書きスタイルのプラグインは優雅に劣化し、プラグイン専用フォーマットは LicenseException で失敗します。
  • 有効な Temporary ライセンスはすべてをアンロックし、プロダクションは購入したものだけをアンロックします。出荷前に IDoconutLicenseService で確認してください。

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