1

我正在使用Prismv4 并MEFTelerik RadDocking. 为了使用这些停靠面板Prism并与这些面板一起使用,需要一个自定义适配器。MEF我有一个工作适配器,其导出如下:

[Export]
public class RadPaneGroupRegionAdapter : RegionAdapterBase<RadPaneGroup>
{
    [ImportingConstructor]
    public RadPaneGroupRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)
        : base(regionBehaviorFactory)
    {
    }
    ...
}

我在引导程序中配置聚合目录,如下所示:

protected override void ConfigureAggregateCatalog()
{
    this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly));
    this.AggregateCatalog.Catalogs.Add(new DirectoryCatalog("Modules"));
    this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ViewModelLocator).Assembly));
    this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MyContractClass).Assembly));
}

棱镜抱怨多次出口?

问题是,当我尝试将此适配器添加到Prism适配器映射时,我收到ImportCardinalityMismatchException,告诉我“找到多个与约束匹配的导出:xxx.Adapters.RadPaneGroupRegionAdapter”

protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
    RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();
    mappings.RegisterMapping(typeof(RadPaneGroup),
        this.Container.GetExportedValue<Adapters.RadPaneGroupRegionAdapter>());

    return mappings;
}

我无法理解为什么会发生这种情况。适配器类与 bootstrapper 在同一个程序集中,所以我希望只有一个匹配的导出。

请帮忙!

更新:

如果我注释掉这一行,则永远不会抛出异常:

this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MyContractClass).Assembly));

也许问题在于它MyContractClass依赖于相同的Telerik控件?如果是这种情况,我将如何解决这种歧义?

4

1 回答 1

1

这里的问题是导入的候选者不止一个,而 MEF 无法决定使用哪一个。有两种方法可以处理这样的问题:

一种是更新您的构造函数以获取IRegionBehaviorFactory并添加ImportManyAttribute的序列。当然,您必须决定保留哪个工厂。

[ImportingConstructor]
        public RadPaneGroupRegionAdapter([ImportMany]IEnumerable<IRegionBehaviorFactory> regionBehaviorFactory)
            : base(regionBehaviorFactory)
        {
            //Decide which factory to keep.
        }

另一种是使用FilteredCatalog并...过滤零件。您可以阅读这篇关于过滤目录的文章。

如果您添加导出元数据,这两种方法都会更有效。

于 2013-01-19T20:31:21.813 回答