プラグインシステム
プラグインでビューアを拡張する
Doconut のコアは軽量なままです。オプション機能は プラグイン として提供されます — ビューアやサービスを提供する個別の NuGet パッケージで、ライセンスに応じて有効になります。このページでは、登録モデル、ランタイム時のライセンスゲーティングの動作、そして独自のビューアをプラグインする方法を説明します。
このモデルは本リリースで新しく導入されました。以前の .NET Standard ライブラリにはプラグインレジストリがなく、変換はビューア自体に組み込まれ、プラグインのライセンスは静的な Viewer.SetLicensePlugin(...) 呼び出しでインストールされていました。ここではどちらも登録メカニズムではありません。
プラグインの登録
各プラグインパッケージは 1 つのプラグインクラスを公開します。起動時に一度だけ登録します。
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 登録は有効期限が切れても保持されますが、実行時の機能は有効期限日以降に取り消されます。
契約
プラグインは意図的に小さなインターフェイスを実装します。
public interface IDoconutPlugin
{
string Name { get; } // 例: "Doconut DICOM Viewer"
LicenseCapability RequiredCapability { get; } // ライセンスゲート
void Register(IDoconutPluginBuilder builder); // ビューア/サービスを提供する
}Register の内部で、ビルダーは 2 種類の貢献を受け入れます:
builder.RegisterViewer(extension, factory)— ファイル拡張子用のビューア;ファクトリはIFormatViewerを返します(DICOM プラグインはこの方法で.dcmと.imaを登録します)。builder.RegisterService<TContract>(() => …)— パイプラインの他の部分が参照できる型付きサービス。
機能とゲーティング
機能はライセンス単位です。Converter と Dicom はオプトインプラグインとして提供され、Search と Annotation は同様にゲートされた組み込み機能です。ベースビューアは 機能ではなく 前提条件であり、ライセンスサービス上で IsViewerLicensed として公開されます。
起動時の検証は通常、ライセンスがないプラグインがリクエストパイプラインに入るのを防ぎます。ビューアファクトリはさらに 2 つの防御的ランタイムルールを適用します。これらは起動後に権利が変更された場合に重要です:
- プラグインが組み込みビューアを上書きする(プラグインが組み込みレジストリでも処理される拡張子を主張する場合):機能がライセンスされていれば、プラグインビューアが優先されます;ライセンスがない場合、Doconut は静かに組み込みビューアにフォールバックします。ユーザーは依然としてドキュメントを見ることができますが、プラグイン機能は利用できません。
- プラグイン専用フォーマット(例:
.dcm— DICOM には組み込みビューアがありません):機能がない場合、オープン呼び出しはハードに失敗します:
LicenseException: This document type requires the 'Dicom' plugin license.アクティブな Temporary ライセンスはすべての機能を付与します(クリーンで透かしのないベースビューイングが可能)。これは本番稼働時の驚きの典型的な原因です:機能の一つが欠如した購入済みライセンスで同じプラグインを登録すると、AddDoconut() が起動時に失敗します。デプロイ前に IsCapabilityGranted(...) をプランと比較してください。逆に、全くライセンスがない場合、何も付与されません — ライセンスが欠如していることは Temporary ライセンスではありません。
同じゲーティングはクライアント側でも現れます:Viewer.ReferenceScripts() と ReferenceCss() は、ライセンスで有効化された機能(検索、注釈、…)のスクリプト/スタイルバンドルを ライセンスが有効なときだけ 発行し、ウィジェットの UI がサーバーの実際の動作と一致したままになります。
機能とプラグインのマップ
製品 UI では「プラグイン」を広範な機能ラベルとして使用しますが、サーバー側の登録は異なります:
| 機能 | 有効化方法 | 機能 | 貢献内容 |
|---|---|---|---|
| 注釈 | ビューアに組み込まれ、注釈リソースを含む | Annotation | ブラウザでの作成、セッション永続化、そして焼き込みエクスポート |
| 検索 | 検索可能なフォーマットビューアに組み込まれ、検索リソースを含み、必要に応じて抽出を有効化 | Search | ネイティブテキストインデックス、ハイライト、結果ナビゲーション |
| コンバータ | Doconut.NETStandard.Converter をインストールし、ConverterPlugin を登録 | Converter | C# 変換サービスとオプションのウェブウィジェット |
| DICOM | Doconut.NETStandard.Dicom をインストールし、DicomPlugin を登録 | Dicom | .dcm と .ima 用の医療画像ビューイング |
注釈と通常の検索は AddPlugin<TPlugin>() を使用しません;それらのバンドルは対応する機能がライセンスで付与されたときだけ発行されます。コンバータと DICOM は、このドキュメントセット向けにリリースされたオプトイン IDoconutPlugin 実装です。
承認された .NET Standard アーティファクトには、コアパッケージと同じバージョンの Doconut.NETStandard.Converter と Doconut.NETStandard.Dicom が含まれています。
リリースされたプラグインパッケージ
| プラグイン | パッケージ | 機能 | 貢献内容 |
|---|---|---|---|
| コンバータ | Doconut.NETStandard.Converter | Converter | ドキュメント変換機能 |
| DICOM | Doconut.NETStandard.Dicom | Dicom | 医療画像ビューイング(.dcm — プラグイン専用フォーマット) |
それぞれは Plugins の下に専用ページがあり、構成と使用方法が記載されています。
カスタムビューア — 独自のフォーマットハンドラ
プラグインパッケージを書かずに、Program.cs から直接ビューアをパイプラインにプラグインできます:
builder.Services.AddDoconut(options =>
{
options.RegisterViewer(
".myext",
() => new MyCustomViewer(), // IFormatViewer を実装
() => new ImageConfig { ImageResolution = 150 }); // オプションのデフォルト設定
});カスタムビューアは すべて(組み込みとプラグインの両方)に対して優先され、ライセンスでゲートされません(あなたのコードです)。デフォルト設定を提供しない場合、ファクトリは ImageConfig にフォールバックします。
要点
- プラグインは明示的に登録され、その
LicenseCapabilityはAddDoconut()中に検証されます — 欠如または一時的でない権利が不十分な場合はすぐに失敗します。 - 上書きスタイルのプラグインは優雅に劣化し、プラグイン専用フォーマットは
LicenseExceptionで失敗します。 - アクティブな Temporary ライセンスはすべてをアンロックし、プロダクションは購入したものだけをアンロックします。出荷前に
IDoconutLicenseServiceで確認してください。
このページは役に立ちましたか?