このような設定方法を説明します。詳細については、公式ドキュメントを参照してください。
最適な実装は、インターフェイスとダック タイピングを使用することです。
public interface IModule {
DataTemplate Template { get; set; }
string Name{get;set;}
...
}
次に、プラグインごとに、このインターフェースを継承します
[Export(typeof(IModule ))]
public class SampleModule : IModule {
private DataTemplate template;
public DataTemplate IModule.Template {
get { return this.teplate; }
set { this.template = value; }
}
private string name = "SamplePlugin";
public string IModule.Name{
get { return this.name ; }
set { this.name = value; }
}
...
}
クラス SampleModule は別のアセンブリにありますが、IModule は Application とすべてのモジュール アセンブリの両方に共通しています。
ここで、アプリケーションで利用可能なすべてのモジュールをロードする必要があります。このコード スニペットは、アプリケーションのウィンドウからのものです
...
[ImportMany]
public IEnumerable<IModule> ModulesAvailable {get;set;}
...
public void LoadModules(string path) {
DirectoryCatalog catalog = new DirectoryCatalog(path);
catalog.ComposeParts(this);
}
foreach ループを使用して、それらをアプリケーション リソースに追加できるようになりました。
foreach(IModule module in ModulesAvailable) {
Application.Current.Resources.Add(module.Template, module.Name);
}
これは単なる概念であり、コードはテストされていません。
数か月前に行った高校の最終プロジェクトで MEF を使用したので、私のコードを見てください。これは、すべての演算とオペランドがプラグインとしてロードされる式をサポートするスプレッドシート アプリケーションであるため、非常に柔軟です。