我正在构建一个简单的 MEF 应用程序。我想要实现的是构建一个插件,它可以在同一个组合应用程序中多次注册。插件的注册应该取决于插件配置文件中的设置,但我无法做到这一点。
[编辑]
我的具有 CompositionContainer 的服务器需要与 6 个不同的目标(即交通灯控制器)进行通信。对于每个目标,我想添加一个插件。插件逻辑是一样的,所以我只想维护1个插件。每个目标都有自己的网址来进行通信(以及一些其他配置项),我希望它们位于(单独的)配置文件中。
我尝试的是将插件放在子目录中,然后递归地遍历这些目录以将插件添加到目录中。然而这行不通。在子目录中找到的第二个插件将被导入,但这个插件是针对第一个插件的。当循环通过容器 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);
}
Run Code Online (Sandbox Code Playgroud)
我不知道我是否也可以使用 ExportMetadata 属性。似乎必须对 ExportMetadata 属性进行硬编码,但如果可能,我希望从配置文件中读取该属性。
[/编辑]
我的目标是拥有 6 个 ControllerAdapter,每个都针对不同的控制器(阅读:与不同的网络服务器通信)。6 个 ControllerAdapter 中的逻辑是相等的。
我认为复制 ClassLibrary(例如到 1.dll、2.dll 等)并添加配置文件(1.dll.config 等)应该可以解决问题,但没有。
撰写时,我typeof(FAST.DevIS.ControllerAdapter)在容器中获得多个实例,但我不知道如何进一步。
我需要在导出中对 MetaData 做些什么吗?
导入服务器
[ImportMany]
public IEnumerable<IFASTAdapter> FASTAdapters { get; set; }
private void Compose()
{
var …Run Code Online (Sandbox Code Playgroud)