c# – 如何确定MEF中不同目录的优先级?

我有一个AggregateCatalog,其中包含AssemblyCatalog和DirectoryCatalog.

我希望他们像这样工作:

>如果两个目录都可以找到导出,请从DirectoryCatalog中选择一个.
>如果它们都找不到导出,那么只需将导入保留为null即可.
>如果只有其中一个可以找到导出,那么只需使用该导出来填充导入.

我怎样才能实现这样的目标?

解决方法:

您可以通过将目录放在不同的导出提供程序中,然后按照优先级顺序将导​​出提供程序传递给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;

现在你可以像往常一样使用容器,它将首先在目录目录中查找部件,然后在程序集目录中查找.如果两者都存在基数,则不会获得基数异常.

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

上一篇:c# – 依赖注入和第三方API – 带PI或Wrapper的扩展方法


下一篇:java – 通过Composition(接口和类)进行类型转换