我正在构建一个简单的MEF应用程序。我想要实现的是构建一个插件,它可以在同一个组合应用程序中多次注册。插件的注册应该取决于插件配置文件的设置,但我无法做到这一点。如何根据app.config多次导出一个MEF插件?
[编辑]
我的服务器,它具有CompositionContainer中,需要与6个不同的靶标(即,交通灯控制器)进行通信。对于每个目标,我想添加一个插件。插件的逻辑是一样的,所以我只想维护一个插件。每个目标都有自己的Web地址进行通信(以及其他一些配置项),我希望这些目标位于(单独)configfiles中。
我试过的是将插件放在子目录中,并递归地通过这些目录来添加目录中的插件。然而,这不起作用。在子目录中找到的第二个插件将被导入,但是这个插件是针对第一个插件的。在循环容器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个ControllerAdapters,每个针对不同的控制器(读:与不同的网络服务器通信)。 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);
}
}
这是不是很清楚你想要什么。从你的问题主体,你说你在容器中有多个版本,但你不知道如何进一步。那么,是否需要通过app.config控制导出才是唯一的问题?如果你非常清楚你需要什么,有人会更有可能帮助你。 – ChrisO 2013-02-28 14:17:04
试图清楚我的目标是什么。 – Cornelis 2013-02-28 14:40:11
谢谢,这是有道理的。你应该能够在你的界面上使用'InheritedExport'属性。这样你可以从类中删除'Export'属性。当你使用'ImportMany'时,它将带回每个实现'IFASTAdapter'的类。 http://blogs.geniuscode.net/JeremiahRedekop/?p=235 – ChrisO 2013-02-28 16:29:57