【发布时间】:2013-02-28 08:41:56
【问题描述】:
我正在构建一个简单的 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);
}
}
【问题讨论】:
-
不清楚你想要什么。从您的问题正文中,您说您在容器中获得了多个版本,但您不知道如何进一步。那么,您需要控制从 app.config 导出的唯一问题是什么?如果您对自己的需求非常明确,那么有人会更有可能帮助您。
-
试图明确我的目标。
-
谢谢,这是有道理的。您应该能够使用界面上的
InheritedExport属性。这样您就可以从类中删除Export属性。然后,当您使用ImportMany时,它将带回实现IFASTAdapter的每个类。 blogs.geniuscode.net/JeremiahRedekop/?p=235 -
谢谢,去试试!
-
很奇怪,这不起作用。同样在这种情况下,我得到了对同一个程序集的引用。