1

私はPrismv4とMEF一緒に使用していTelerik 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 は複数のエクスポートについて不平を言っていますか?

問題は、このアダプターを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 と同じアセンブリにあるため、一致するエクスポートは 1 つだけであると予想されます。

助けてください!

アップデート:

この行をコメントアウトすると、例外はスローされません。

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

おそらく問題は、同じコントロールMyContractClassに依存していることですか? Telerikその場合、このあいまいさをどのように解決しますか?

4

1 に答える 1

1

ここでの問題は、インポートの候補が複数あり、MEF がどれを使用するかを決定できないことです。このような問題に対処するには、次の 2 つの方法があります。

1 つは、コンストラクターを更新して一連のImportManyAttributeIRegionBehaviorFactoryを取得し、追加することです。もちろん、保持する工場を決定する必要があります。

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

もう 1 つは、FilteredCatalogを使用して ... パーツをフィルタリングすることです。カタログのフィルタリングに関するこの記事を読むことができます。

エクスポート メタデータを追加すると、どちらのアプローチもより効率的になります。

于 2013-01-19T20:31:21.813 に答える