PrismとMEFで構築されたアプリケーションがあります。ロードするモジュール(同じソリューション内で定義)がいくつかあり、すべてが正常に機能します。
ただし、ユーザーが独自のプラグインを追加できるようにしたいと思います(基本的に、これらのプラグインはデータポイントのコレクションを変更する必要があります)。つまり、ユーザーは、ViewModel内にあるこれらのデータポイントを変更するアルゴリズム(プラグイン)を作成します。
新しいプラグインを作成するときにユーザーが守る必要のある、ある種の「コントラクト」を定義する必要があります。どうすればよいですか?
プラグインは/ Pluginフォルダー内の単一の.dllであり、実行時にロードする必要があります。ListViewは、各プラグインのUserControlを含むビューに入力する必要があります。
MEFは、この作業を非常に簡単かつスムーズにします。
プラグインの場合:
プラグインのインターフェースを作成します。それほど複雑である必要はありませんが、開発者に説明やバージョン情報を追加するように強制することもできます。もちろん、コレクションを受け取って変換するメソッドもあります。
プラグインは、ExportAttributeを使用してMEFに通知する必要があります。
[Export(typeof(IPlugin))]
public class Plugin : IPlugin
それはここで素晴らしいはずです。
アプリケーションの場合:
MEFが見つけることができるプラグインのリストを受け取るコレクションを宣言します。ImportManyAttributeを忘れないでください。
[ImportMany(typeof(IPlugin))]
public IEnumerable<IPlugin> Plugins{ get; set; }
カタログとコンテナを作成します。私が示すコードでは、2つのカタログを追加します。おそらく、それは必要ありません。1つのソースをさらに持つことができることを知っているだけです。
AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog("plugins"));
var container = new CompositionContainer(catalog);
魔法をかけてください。もちろんthis
、それを持つオブジェクトである必要がありますImportManyAttribute
。
container.ComposeParts(this);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加