プラグインシステム

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

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.NET6.Converter をインストールし、ConverterPlugin を登録ConverterC# 変換サービスとオプションの Web ウィジェット
DICOMDoconut.NET6.Dicom をインストールし、DicomPlugin を登録Dicom.dcm.ima 用の医療画像ビューア

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

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

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

プラグインパッケージ機能貢献内容
ConverterDoconut.NET6.ConverterConverterドキュメント変換機能
DICOMDoconut.NET6.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 で確認してください。

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