在我的应用程序的根目录中,我有一个 AggregateCatalog 和一个 CompositionContainer,如下所示:
AggregateCatalog aggregateCatalog = new AggregateCatalog();
CompositionContainer compositionContainer = new CompositionContainer(aggregateCatalog);
我的应用程序加载了包含多个导出的模块,如下图所示。我想使用 CompositionScopeDefinition 来确定图中圈出的导出范围。
// Create CompositionScopeDefinition.
TypeCatalog globalParts = new TypeCatalog(typeof(RequestListener));
TypeCatalog scopedParts = new TypeCatalog(typeof(RequestHandler), typeof(DataAccessLayer), typeof(Logger), typeof(DatabaseConnection));
CompositionScopeDefinition compositionScopeDefinition = new CompositionScopeDefinition(
globalParts,
new[] { new CompositionScopeDefinition(scopedParts, null) });
// Register CompositionScopeDefinition.
aggregateCatalog.Catalogs.Add(compositionScopeDefinition);
// Create an instance of RequestListener.
RequestListener requestListener = compositionContainer.GetExportedValue<RequestListener>();
但是,这会导致以下异常:
System.ComponentModel.Composition.ImportCardinalityMismatchException 发生消息=未找到与约束匹配的导出:ContractName MyNamespace.RequestListener RequiredTypeIdentity MyNamespace.RequestListener InnerException:
如何使用 CompositionScopeDefinition 将我的范围导出添加到现有的 AggregateCatalog 并使用我现有的 CompositionContainer 对其进行初始化?
更新
似乎是使用 AggregateCatalog 的问题。如果我将 CompositionScopeDefinition 直接添加到 CompositionContainer 中,一切正常,但这会阻止我将其他目录添加到 CompositionContainer。