我有一个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).