MEF InheritedExport隐藏?

时间:2011-01-30 21:09:47

标签: inheritance import export mef

为模糊的问题框架道歉。

情况如下。我在Assembly1(类库)中有ParentA。 ParentA导出ParentA的类型

现在另一个产品团队想要覆盖ChildA中的一些行为,并在ChildA中部署他们的Assembly - Assembly2,它包含对Assembly1的引用(显然)。

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

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

我如何解决这种情况?

2 个答案:

答案 0 :(得分:3)

也许这就是你正在寻找的东西:

http://msdn.microsoft.com/en-us/library/ee155691.aspx#avoiding_discovery

这就是它所说的:

  

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

     

如果这个类不能被抽象化,你可以用它来装饰它   PartNotDiscoverable属性。用此属性修饰的部件   不会包含在任何目录中。以下示例   演示了这些模式。 DataOne将被发现   目录。由于DataTwo是抽象的,因此不会被发现。以来   DataThree使用PartNotDiscoverable属性,但不会   发现的。

<Export()>
Public Class DataOne
    'This part will be discovered 
    'as normal by the catalog.
End Class

<Export()>
Public MustInherit Class DataTwo
    'This part will not be discovered
    'by the catalog.
End Class

<PartNotDiscoverable()>
<Export()>
Public Class DataThree
    'This part will also not be discovered
    'by the catalog.
End Class

答案 1 :(得分:2)

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

有一种解决方法:如果将多个导出提供程序传递给容器,容器将在查找导出时依次查询每个导出提供程序。提供该部分的第一个出口提供商,获胜。

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

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。在这种情况下,您确实仍然会获得两个导出,并且您必须在它们上添加一些metadata。然后,您可以在导入类中编写代码,以确定哪个导入是“最佳”。另请参阅blog post Daniel Plaisted。{/ p>