私のシミュレーションアプリケーションは、プラグインを使用して、シミュレーションデータを格納するためのシミュレーションアルゴリズムとデータ構造を提供します。アプリケーションは2つの部分で構成されています。1つは、UIを提供するホストアプリケーションです(WPF UIまたはCADアプリケーションへのプラグインとして)。このアプリケーションは、ユーザーとのすべての対話を処理しますが、シミュレーション計算を実行せず、シミュレーションデータも保存しません。2番目の部分は、シミュレーション計算を実行するデータアプリケーションです。データアプリケーションには、ユーザーが直接対話する方法がありません。すべての入力は、ホストとの接続を介して提供されます(両方が同じマシン上にある場合は名前付きパイプを介して、異なるマシン上にある場合はTCPを介して)。
データアプリケーションには、新しい機能を簡単に追加できるように、1つ以上のプラグインを介してデータストレージメソッド、シミュレーションアルゴリズムなどが提供されます。これが機能するための計画は次のとおりです。
- ホストアプリケーションにプラグインの検索を実行させます。ホストはプラグインとそのメタデータを説明するデータを保存する必要がありますが、プラグインクラスをインスタンス化することはありません。アセンブリがホストアプリケーションにロードされないようにするには、プラグインの説明をある種のシリアル化された形式で保存する必要があります。
- データセットアプリケーションは、ホストにプラグイン情報を要求し、ロードするプラグインを決定し、正しいアセンブリの転送を要求し(分散コンピューティングに必要)、プラグインをロードします。
- 正しいプラグインの選択は、タイプ(System.Typeのように)および優先度などの追加情報に基づいて行う必要があります。
これらすべてが機能するためには、次のことを行う必要があると思います。
- データアプリケーション用のある種の遅延読み込みカタログ(SilverlightのDeploymentCatalogなど)を作成します。トリックはおそらく、アプリケーションがどのクラスをインスタンス化する必要があるかを判断した後でのみ、アセンブリの転送とロードを要求することです。
- プラグインアセンブリがホストアプリケーションにロードされないように、プラグイン情報をシリアル化された(文字列?)形式で格納するホストアプリケーション用の独自のアセンブリスキャンメカニズムを作成します。
- 正しいプラグインクラスを選択し、それをロードする方法と提供する構築引数を決定できる、ある種のロードメカニズムを記述します。
- プラグインが設定値(デフォルト値とその値のローカライズされた説明を含む)とメタデータを指定できるようにする方法を見つけてください。
できる限り作業を少なくしたいので、.NETで利用可能なプラグインシステムのいくつかを調べました。見た目からすると、MEFが最も有望な候補のようです。MEFのアーキテクチャと能力について読みましたが、どこにエネルギーを集中させるべきかについては、まだ少し暗闇の中にいます。だから私の質問は、MEFを私の計画したアプローチで機能させるためにMEFのどの部分をカスタマイズする必要があるかということです。