私は .NET ベースのアプリケーションを構築しており、より拡張可能でプラグ可能な設計を可能にしたいと考えています。
簡単にするために、アプリケーションは一連の操作とイベントを公開します。
- DoSomething()
- DoOtherThing()
- OnError
- 成功時
「プラグイン」をロードして、これらの操作の一部にフックしたいと思います (次のようなものです: Event1 が起動したら、plugin1 を実行します)。
たとえば、 OnErrorイベントが発生したときにplugin1.HandleError()を実行します。
これは、イベント サブスクリプションで簡単に実行できます。
this.OnError += new Plugin1().HandleError();
問題はそれです:
- 私のアプリはタイプ「Plugin1」を認識していません (これはプラグインであり、私のアプリはそれを直接参照していません)。
- そうすることで、時間の前にプラグインがインスタンス化されますが、これはやりたくないことです。
「従来の」プラグイン モデルでは、アプリケーション (プラグインの「クライアント」) が特定のキー ポイントでプラグイン コードをロードして実行します。たとえば、特定の操作が実行されたときの画像処理アプリケーション)。
プラグイン コードをインスタンス化するタイミングと実行するタイミングの制御は、クライアント アプリケーションに認識されています。
私のアプリケーションでは、プラグイン自体がいつ実行するかを決定します (「プラグインは OnError イベントに登録する必要があります」)。
プラグインの「実行」コードを「登録」コードと一緒に保持すると、登録時にプラグイン DLL がメモリにロードされるという問題が発生します。
たとえば、プラグイン DLL に Register() メソッドを追加する場合、Register メソッドを呼び出すには、プラグイン DLL をメモリにロードする必要があります。
この特定の問題に対する適切な設計ソリューションは何でしょうか?
- プラグイン DLL のレイジー ロード (またはレイジー/イーガー ロードの提供)。
- プラグインがフックするシステム/アプリのさまざまな部分を制御できるようにします。