拥有两个单独的 MEF 插件容器是否不好

本文关键字:插件 是否 MEF 单独 两个 拥有 | 更新日期: 2023-09-27 18:37:19

假设我有一个类(不是静态类),A ,它以某种方式使用插件。我使用 MEF 来管理这些插件,并为我的用户添加添加零件目录的方法。用法示例:

var myA = new A();
myA.LoadPlugins(new DirectoryCatalog("path/to/plugins"));
myA.DoStuffWithPlugins();

在与A相同的命名空间中是类BB也使用MEF来管理插件,并有自己的CompositionContainer。如果用户想与B的插件进行交互,她必须使用B的插件管理方法。

B的使用就像上面的A一样。

我的问题是,这很糟糕吗?我应该关心在我的命名空间中有两个单独的位置来加载插件吗?如果不好,还有什么选择?

拥有两个单独的 MEF 插件容器是否不好

我的问题是,这很糟糕吗?我应该关心在我的命名空间中有两个单独的位置来加载插件吗?如果不好,还有什么选择?

不一定。 没有理由不能在同一应用程序中使用两个完全独立的组合。

话虽如此,在大多数情况下,也没有真正的理由拥有多个作品。 MEF 将同时组成两组数据。 在您的情况下,您可以使用相同的组合容器来撰写导入程序和报表,这样做的好处是允许正在扩展系统的人仅创建扩展应用程序的两个部分的单个程序集。

这里一个潜在的小危险信号是,它们是同一命名空间中的两个独立类型,但每个类型都有自己的插件系统。 通常,具有完整插件系统的框架将足够复杂,以至于我会质疑它们是否属于同一命名空间 - 尽管通过"A"和"B"的类型名称,不可能知道这是否真的不合适。

我认为这没有任何问题。我会推荐一个基类,用于重用方法class Aclass B

class A : BaseCompositionClass {
    //    implementations
}
class B : BaseCompositionClass {
    //    implementations
}

可以使用单个CatalogExportProvider,然后查询该提供程序以获取匹配的导入和导出。然后,您可以使用单个CompositionFactoryclassAclassB从中请求合成。