プラグインシステム

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

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 の登録は有効期限が切れても保持されますが、実行時の機能は有効期限後に取り消されます。

契約

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

text
public interface IDoconutPlugin
{
    string Name { get; }                          // e.g. "Doconut DICOM Viewer"
    LicenseCapability RequiredCapability { get; } // the license gate
    void Register(IDoconutPluginBuilder builder); // contribute viewers/services
}

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

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

機能とゲート

機能はライセンス単位です。ConverterDicom はオプトイン プラグインとして提供され、SearchAnnotation は同様にゲートされる組み込み機能です。ベース ビューアは 機能ではなく、前提条件であり、ライセンスサービスの 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# 変換サービスとオプションの Web ウィジェット
DICOMDoconut.NET8.Dicom をインストールし、DicomPlugin を登録Dicom.dcm.ima の医療画像閲覧

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

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

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

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

プラグイン パッケージを作成せずに、Program.cs から直接ビューアをパイプラインに組み込むことができます:

text
builder.Services.AddDoconut(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),               // implements IFormatViewer
        () => new ImageConfig { ImageResolution = 150 }); // optional default config
});

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

要点

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

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