簡単なMEFアプリケーションを作成しています。私が達成したいのは、同じ構成アプリケーションに複数回登録できる1つのプラグインを作成することです。プラグインの登録は、プラグインのconfigfileの設定に依存する必要がありますが、これを行うことはできません。
[編集]
CompositionContainerを備えた私のサーバーは、6つの異なるターゲット(つまり、信号機コントローラー)と通信する必要があります。すべてのターゲットに対して、プラグインを追加したいと思います。プラグインのロジックは同じなので、1つのプラグインだけを維持したいと思います。すべてのターゲットには、通信するための独自のWebアドレス(およびその他の構成項目)があります。これらを(個別の)構成ファイルに含める必要があります。
私が試したのは、プラグインをサブディレクトリに配置し、それらのディレクトリを再帰的に調べて、カタログにプラグインを追加することです。ただし、これは機能しません。サブディレクトリにある2番目のプラグインがインポートされますが、これは最初のプラグインを対象としています。コンテナFASTAdaptersをループすると、すべてのパーツが最初のパーツと同じように見えます。
private void Compose()
{
var catalog = new AggregateCatalog();
string sDir = AppSettingsUtil.GetString("FASTAdaptersLocation", @"./Plugins");
foreach (string d in Directory.GetDirectories(sDir))
{
catalog.Catalogs.Add(new DirectoryCatalog(d));
}
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
ExportMetadata属性も使用できるかどうかわかりません。ExportMetadata属性はハードコーディングする必要があるようですが、可能であれば、構成ファイルから属性を読み取ってほしいと思います。
[/編集]
私の目標は、それぞれが異なるコントローラーをターゲットとする6つのControllerAdapterを用意することです(異なるWebサーバーとの通信を読んでください)。6つのControllerAdaptersのロジックは同じです。
ClassLibraryをコピーして(たとえば、1.dll、2.dllなどに)、configfiles(1.dll.configなど)を追加することでうまくいくと思いましたが、そうではありません。
作成するとき、コンテナ内に複数のインスタンスを取得しますtypeof(FAST.DevIS.ControllerAdapter)
が、さらに取得する方法がわかりません。
エクスポートでMetaDataを使用して何かを行う必要がありますか?
インポートサーバー
[ImportMany]
public IEnumerable<IFASTAdapter> FASTAdapters { get; set; }
private void Compose()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(AppSettingsUtil.GetString("FASTAdaptersLocation", Path.GetDirectoryName(Assembly.GetAssembly(typeof(ControllerServer)).Location))));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
プラグイン
namespace FAST.DevIS.ControllerAdapter
{
[Export (typeof(IFASTAdapter))]
public class ControllerAdapter : IFASTAdapter
{
...
}
}
インターフェース
namespace FAST.Common.FastAdapter
{
public interface IFASTAdapter
{
/// Parse plan parameters
///
//Activator
bool ParsePlan(PlansContainer plan);
bool ActivatePlan();
void Configure(string config);
}
}