プラグインシステム

Extend the viewer with plugins

Doconut のコアはシンプルに保たれています。オプション機能は プラグイン として提供されます — ビューアやサービスを提供する個別の NuGet パッケージで、ライセンスに応じて有効になります。このページでは、登録モデル、ライセンスがプラグインをカバーしない場合の起動時の挙動、そして独自のビューアをプラグインする方法を説明します。

プラグインの登録

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

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});
// ライセンスが欠如している登録プラグインは Application_Start でここで例外をスローし、
// サイトはその後、すべてのリクエストに空の 500 応答を返します。理由は Windows イベントログにあります。

AddPlugin<TPlugin>() はプラグインを作成し、DoconutOptions に対してその貢献を登録させます。プラグインが提供するすべてはプラグインの 必須機能 としてタグ付けされ、DoconutHost.Initialize はサイトが最初のリクエストを処理する前に、すべての登録プラグインをライセンスと照合します。

プラグインのライセンスが欠如するとサイトが停止する

有効なライセンスが登録プラグインの機能を付与していない場合 — ライセンスが全くない、レガシーな TRIAL ファイル、またはその機能を含まない有料ライセンス — DoconutHost.Initialize は Application_Start から InvalidOperationException をスローします:

text
The Converter plugin is registered via AddPlugin but no active license grants Converter.
Remove the AddPlugin<...>() call or install a license (or trial/demo) that includes Converter.

System.Web では、Application_Start の例外はエラーページを生成しません。すべてのリクエストは空の 500 を返します、IIS ログには有用な情報が記録されず、メッセージは Windows のイベントログ(Application ログ、ソース ASP.NET)にのみ表示されます。AddPlugin 行を追加した直後にサイトが応答しなくなった場合は、まず wwwroot のライセンスファイルを確認してください — ライセンス設定 を参照。

契約

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

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 と .ima — DICOM には組み込みビューアがありません):機能がない場合、開くことに失敗します:
text
LicenseException: This document type requires the 'Dicom' plugin license.

有効な Temporary ライセンスはすべての機能を付与します。 これは典型的な本番リリース時の驚きです:評価期間中に実行された同じ AddPlugin 行が、購入したライセンスがその機能のいずれかを除外するとサイトを停止させます。デプロイ前に購入したものと IsCapabilityGranted(...) を比較してください。ライセンスが全くない場合、何も付与されません — ライセンスが欠如していることは Temporary ライセンスではありません。

同じゲートはブラウザにも適用されます:Viewer.ReferenceScripts() と ReferenceCss() は、ライセンスが付与した場合にのみ、ライセンス制御された機能(検索、注釈)のファイルを出力します。したがってページはサーバーが拒否する機能を提示することはありません。

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

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

Annotation と Search は AddPlugin<TPlugin>() を使用しません。Converter と DICOM にはそれぞれ プラグイン の下にページがあり、設定と使用方法が記載されています。このパッケージでは、DICOM はページ、フレーム、アニメーションをレンダリングしますが、技術メタデータは読み取りません — DICOM プラグイン を参照してください。

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

プラグインパッケージを書かずに、Application_Start で直接ビューアをパイプラインに組み込むことができます:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.RegisterViewer(
        ".myext",
        () => new MyCustomViewer(),                        // IFormatViewer を実装します
        () => new ImageConfig { ImageResolution = 150 });  // オプションのデフォルト config
});

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

要点

  • プラグインは DoconutHost.Initialize で明示的に登録され、その機能はそこで検証されます。権利が欠如すると、空の 500 でサイトが停止し、その理由は Windows のイベントログに記録されます。
  • 上書きスタイルのプラグインは優雅に劣化し、プラグイン専用フォーマットは LicenseException で失敗します。
  • 有効な Temporary ライセンスはすべてを解放し、プロダクションは購入したものだけを解放します。出荷前に IDoconutLicenseService で確認してください。

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