如何确定MEF中不同目录的优先顺序?

时间:2012-03-01 16:36:05

标签: c# .net mef composition

我有一个包含AssemblyCatalog和DirectoryCatalog的AggregateCatalog。

我希望他们像这样工作:

  1. 如果两个目录都可以找到导出,请从DirectoryCatalog中选择一个。
  2. 如果他们都找不到导出,那么只需将导入保留为空。
  3. 如果只有其中一个可以找到导出,那么只需使用该导出来填充导入。
  4. 我怎样才能达到这样的目标?

1 个答案:

答案 0 :(得分:7)

您可以通过将目录放在不同的导出提供程序中,然后按照优先级顺序将导​​出提供程序传递给CompositionContainer构造函数来实现第1点和第3点:

var dirCatalog = new DirectoryCatalog(...);
var provider1 = new CatalogExportProvider(dirCatalog);

var assemblyCatalog = new AssemblyCatalog(...);
var provider2 = new CatalogExportProvider(assemblyCatalog);

var container = new CompositionContainer(provider1, provider2);

// link the export providers back to the container, so that they can
// resolve parts from other export providers
provider1.SourceProvider = container;
provider2.SourceProvider = container;

现在您可以像往常一样使用container,它将首先在目录目录中查找部件,然后在程序集目录中查找。当它们存在时,你不会得到基数异常。

要实现第2点,您必须将单个导入标记为允许使用null的默认值(例如[Import(typeof(SomeType),AllowDefault=true])。