Inheritance MEF继承导出隐藏?

Inheritance MEF继承导出隐藏?,inheritance,import,export,mef,Inheritance,Import,Export,Mef,为这个模糊的问题道歉 情况是这样的。我在Assembly1(类库)中有ParentA。ParentA导出ParentA的类型 现在,另一个产品团队希望覆盖ChildA中ParentA的一些行为,并部署其Assembly-Assembly2,它包含对Assembly1的引用(显然) 要求是ParentA被ChildA完全隐藏,所有导入ParentA的容器现在都应该获得对ChildA实例的引用。标准继承的东西 但是-MEF会同时导出ParentA和ChildA的实例吗 我将如何解决这种情况?当MEF

为这个模糊的问题道歉

情况是这样的。我在Assembly1(类库)中有ParentA。ParentA导出ParentA的类型

现在,另一个产品团队希望覆盖ChildA中ParentA的一些行为,并部署其Assembly-Assembly2,它包含对Assembly1的引用(显然)

要求是ParentA被ChildA完全隐藏,所有导入ParentA的容器现在都应该获得对ChildA实例的引用。标准继承的东西

但是-MEF会同时导出ParentA和ChildA的实例吗


我将如何解决这种情况?

当MEF为
ClassA
找到两个导出时,当它只需要一个导出时,它将抛出一个
CompositionException
表示存在基数问题。它不知道如何在两者之间做出选择

有一种解决方法:如果将多个导出提供程序传递给一个容器,那么容器在查找导出时会依次查询每个导出提供程序。第一个提供零件的出口供应商wins

在以下示例中,“自定义”子文件夹中的程序集提供的导出将覆盖可执行文件文件夹中的程序集提供的导出

var defaultExportProvider = 
    new CatalogExportProvider(new DirectoryCatalog(".","*"));
var customizedExportProvider = 
    new CatalogExportProvider(new DirectoryCatalog(@".\customized"));
var container = new CompositionContainer(
    customizedExportProvider, defaultExportProvider);
defaultExportProvider.SourceProvider = container;
customizedExportProvider.SourceProvider = container;
编辑


由于所描述的解决方案不令人满意,我只能假设您使用的是
ImportMany
,而不是
Import
。在这种情况下,你仍然会得到这两个出口,你将不得不增加一些他们。然后,您可以在您的导入类中编写代码,该类决定哪个导入是“最好的”。另请参见。

当MEF为
ClassA
找到两个导出时,当它只需要一个导出时,它将抛出一个
CompositionException
表示存在基数问题。它不知道如何在两者之间做出选择

有一种解决方法:如果将多个导出提供程序传递给一个容器,那么容器在查找导出时会依次查询每个导出提供程序。第一个提供零件的出口供应商wins

在以下示例中,“自定义”子文件夹中的程序集提供的导出将覆盖可执行文件文件夹中的程序集提供的导出

var defaultExportProvider = 
    new CatalogExportProvider(new DirectoryCatalog(".","*"));
var customizedExportProvider = 
    new CatalogExportProvider(new DirectoryCatalog(@".\customized"));
var container = new CompositionContainer(
    customizedExportProvider, defaultExportProvider);
defaultExportProvider.SourceProvider = container;
customizedExportProvider.SourceProvider = container;
编辑


由于所描述的解决方案不令人满意,我只能假设您使用的是
ImportMany
,而不是
Import
。在这种情况下,你仍然会得到这两个出口,你将不得不增加一些他们。然后,您可以在您的导入类中编写代码,该类决定哪个导入是“最好的”。另请参见。

也许这就是您正在/正在寻找的:

它是这样说的:

在某些情况下,您可能希望防止零件被发现 目录的一部分。例如,部件可以是预期的基类 从继承而来,但不被使用。有两种方法可以实现 这首先,您可以在零件类上使用
abstract
关键字。 抽象类从不提供导出,尽管它们可以提供 继承导出到从它们派生的类

如果类不能抽象,可以使用
PartNotDiscoverable
属性。用此属性装饰的部件 不会包含在任何目录中。下面的例子 演示这些模式<代码>数据一将由 目录由于
DataTwo
是抽象的,因此不会被发现。自从
DataThree
使用了
PartNotDiscoverable
属性,它不会 发现


公共类DataOne
"这部分会被发现的
“与目录中的正常情况一样。
末级
公共MustInherit类DataTwo
"这部分不会被发现
“按目录。
末级
公共类数据三
"这部分也不会被发现
“按目录。
末级

也许这就是您正在/正在寻找的:

它是这样说的:

在某些情况下,您可能希望防止零件被发现 目录的一部分。例如,部件可以是预期的基类 从继承而来,但不被使用。有两种方法可以实现 这首先,您可以在零件类上使用
abstract
关键字。 抽象类从不提供导出,尽管它们可以提供 继承导出到从它们派生的类

如果类不能抽象,可以使用
PartNotDiscoverable
属性。用此属性装饰的部件 不会包含在任何目录中。下面的例子 演示这些模式<代码>数据一将由 目录由于
DataTwo
是抽象的,因此不会被发现。自从
DataThree
使用了
PartNotDiscoverable
属性,它不会 发现


公共类DataOne
"这部分会被发现的
“与目录中的正常情况一样。
末级
公共MustInherit类DataTwo
"这部分不会被发现
“按目录。
末级
公共类数据三
"这部分也不会被发现
“按目录。
末级

我很困惑。你把
ChildA
改名为
ClassB
了吗?@Wim-很抱歉。重命名这些类以使其更清晰。我在凌晨3点发帖,我很困惑。你把
ChildA
改名为
ClassB
了吗?@Wim-很抱歉。重命名这些类以使其更清晰。我在凌晨3点发帖,我一定是没有正确地表达这个问题。假设我可以将ParentA的列表导入到集合中。问题是其中一个模块想要隐藏基类的导出,而只导出继承的类。那怎么可能呢?我一定没有把问题说清楚