我正在构建一个简单的 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);
}
我不知道我是否也可以使用 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 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);
}
}