3
public interface IPlugin
{
    public bool execute();
}

私のすべての「パーツ」は、この IPlugin インターフェイスを実装しています。私の部品には明らかに輸入/輸出要件/提供物があります。

私は、ユーザーが必要なものを動的に選択するビルド + 構成システムを作成しています。これは、呼び出されるプラグインのセットに変換されます。

たとえば、プラグインのリストは次のとおりです。

(1) X をインストール ... "XTypeInstalled" をエクスポート

(2) X の構成 ... "XTypeInstalled" をインポートし、"XTypeConfigured" をエクスポートします。

(3) Y をインストール ... "XTypeConfigured" をインポート

(4) Zのインストール

(5) 設定A

ここで、ユーザーは (1)、(3)、および (4) を選択することも、(1)、(2)、(3) を選択することもできます。

私が直面している問題は、すべてのプラグイン作成者が IPartImportsSatisfiedNotification を実装する必要があるかどうかです。そうでない場合、ユーザーは (1)、(2)、(3) のワークフローを選択します ... (3) の execute() メソッドを呼び出すにはどうすればよいですか。

私は理にかなっていますか?

4

1 に答える 1

4

このようなプログラムのランタイム フローを管理するために MEF を使用することについてはよくわかりません。MEF はプラグインの検索と読み込みに最適ですが、非常に疎結合のシステム向けに設計されているため、必要なレベルの制御ができない場合があります。

たとえば、依存関係の解決プロセスはタスクに依存関係を提供しますが、依存関係の構造が何であるかを調べる機会はありません。

たとえば、タスクが 1 回だけ実行されることを保証したい場合や、あるタスクを別のタスクに置き換えたい場合は、注意が必要です。

MEF を使用してプラグインを検索することをお勧めしますが、プラグインを実行するために MEF とは独立したリッチ オブジェクト モデルを開発することをお勧めします。

例えば:

[Export(typeof(IPlugin)), ExportMetadata("Name", "ConfigureX")]
public class ConfigureXPlugin : IPlugin { ...

次に、MEF を使用して、利用可能なすべてのプラグインを見つけます。

public class BuildRunner {
  [ImportMany]
  Lazy<IPlugin, IPluginMetadata> plugins[];

  void RunBuild(...) {
    // Figure out which tasks should execute, in which order, and call each of them

お役に立てれば。それでも問題が解決しない場合は、問題についてさらに情報を投稿してください。

ニック

于 2009-09-03T18:06:36.513 に答える