我正在构建一个简单的MEF应用。我想实现的是构建一个插件,可以在同一组合应用程序中多次注册。插件的注册应该取决于插件配置文件中的设置,但我无法做到这一点。
[编辑]
我的服务器拥有CompositionContainer,需要与6个不同的目标(即红绿灯控制器)进行通信。对于每个目标,我都想添加一个插件。插件逻辑相同,因此我只想维护一个插件。每个目标都有自己的Web地址以进行通信(以及其他一些配置项),我希望这些内容在(单独的)配置文件中。
我尝试将插件放置在子目录中,并递归浏览这些目录以将插件添加到目录中。然而,这并没有起作用。在子目录中找到的第二个插件将被导入,但是这个插件会定位到第一个插件。当循环遍历容器FASTAdapters时,所有部件似乎都等于第一个。
接口
[编辑]
我的服务器拥有CompositionContainer,需要与6个不同的目标(即红绿灯控制器)进行通信。对于每个目标,我都想添加一个插件。插件逻辑相同,因此我只想维护一个插件。每个目标都有自己的Web地址以进行通信(以及其他一些配置项),我希望这些内容在(单独的)配置文件中。
我尝试将插件放置在子目录中,并递归浏览这些目录以将插件添加到目录中。然而,这并没有起作用。在子目录中找到的第二个插件将被导入,但是这个插件会定位到第一个插件。当循环遍历容器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,每个Adapter针对一个不同的控制器(即与不同的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);
}
}
InheritedExport
属性。这样你就可以从类中删除Export
属性。当你使用ImportMany
时,它会带回实现IFASTAdapter
的每个类。http://blogs.geniuscode.net/JeremiahRedekop/?p=235 - ChrisO