小编Cor*_*lis的帖子

如何根据 app.config 多次导出一个 MEF 插件?

我正在构建一个简单的 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)

.net c# mef

4
推荐指数
1
解决办法
1563
查看次数

标签 统计

.net ×1

c# ×1

mef ×1