2

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

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

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

B就像A上面一样使用。

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

4

2 回答 2

2

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

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

话虽如此,在大多数情况下,也没有真正的理由拥有多个组合。MEF 将同时组合两组数据。在您的情况下,您可以使用相同的组合容器组合您的导入程序和您的报告,这将具有允许扩展您的系统的人只创建一个扩展您的应用程序的两个部分的单个程序集的优势。

这里一个潜在的小红旗是,它们是同一命名空间中的两种不同类型,但每种类型都有自己的插件系统。通常,具有完整插件系统的框架将足够复杂,以至于我会质疑它们是否属于同一个命名空间——尽管从“A”和“B”的类型名称来看,不可能知道这是否真的是不当。

于 2012-06-16T01:34:09.617 回答
1

我看不出有什么问题。我会推荐一个基类class Aclass B重用方法。

class A : BaseCompositionClass {
    //    implementations
}

class B : BaseCompositionClass {

    //    implementations
}

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

于 2012-06-16T01:32:13.597 回答