4

MEF 2 以降、MEF はオープン ジェネリック型のクローズ型への合成をサポートしていることを理解しています。同じ合成コンテナーに追加された 2 つの異なるアセンブリからエクスポートされた型から閉じた型を合成しようとしていますが、ImportCardinalityMismatchException を受け取ります。私の管理下にないため、アセンブリの 1 つに規則を使用しています。もう一方については、属性を使用しました。

ジェネリックに関する用語がかなり混乱しているため、質問の言い方が正確にはわかりませんが、独自のクラスを明示的に実装せずに、Foo から継承し、FooUser 型パラメーターを提供することなく、新しい閉じた型を作成しようとしています。これが私がこれを行っている方法の問題なのか、それとも型が異なるアセンブリにあるという事実と関係があるのか​​ どうかはわかりません。

あるアセンブリには、次のものがあります。

public class Foo<T> where T : Bar {}
public class Bar {}

別のアセンブリには、次のものがあります。

[Export]
public class Bar2 : Bar {}

[Export]
public class Something
{
    [ImportingConstructor] 
    public Something([Import(typeof(Foo<>))] Foo<Bar2> foo) {}
}

私の登録コードでは、次のことを行いました。

var conventions = new RegistrationBuilder();
conventions.ForType(typeof(Foo<>)).Export();

var aggregateCatalog = new AggregateCatalog();
var catalog = new AssemblyCatalog(typeof(Foo<>).Assembly, conventions);
aggregateCatalog.Catalogs.Add(catalog);

catalog = new AssemblyCatalog(typeof(Something).Assembly);
aggregateCatalog.Catalogs.Add(catalog);

catalog = new AssemblyCatalog(typeof(Bar2).Assembly);
aggregateCatalog.Catalogs.Add(catalog);

var container = new CompositionContainer(aggregateCatalog, CompositionOptions.DisableSilentRejection);
var batch = new CompositionBatch();
batch.AddExportedValue(container);
container.Compose(batch);

後で、次のように値をエクスポートしようとします。

container.GetExportedValue<Something>();

Exception:Thrown: "制約に一致するエクスポートが見つかりませんでした: ContractName Foo(Bar2) RequiredTypeIdentity Foo(Bar2)" (System.ComponentModel.Composition.ImportCardinalityMismatchException) System.ComponentModel.Composition.ImportCardinalityMismatchException がスローされました: "エクスポートが見つかりませんでした制約に一致するもの: ContractName Foo(Bar2) RequiredTypeIdentity Foo(Bar2)"

コンベンション インスタンスを調べたところ、コンテナには Foo{0}、Bar2、Something などのパーツがあります。ただし、まだ System.ComponentModel.Composition.ImportCardinalityMismatchException を受け取ります。

IRepository はあるが、より具体的なものがある場合やアセンブリにまたがるアイテムがない場合など、より抽象的なケースでこれが行われるのを見てきました。どんな援助でも大歓迎です。役に立つものがない限り、おそらく問題のある型から継承して、それで終わります。

編集:実際のプロジェクトで実際にここにいるのとは異なることをしている可能性がなく、上記の非常に単純化された例を作成したところ、さまざまな同様の結果が得られました。単純化した例に合わせて、いくつかの型の名前を変更しました。

構成で 1 つの構成エラーが発生しました。根本的な原因を以下に示します。詳細については、CompositionException.Errors プロパティを確認してください。

1) 制約に一致するエクスポートが見つかりませんでした: ContractName CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2) RequiredTypeIdentity CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)

結果: パーツ 'CompositionTest.Something' に import 'CompositionTest.Something..ctor (Parameter="foo", ContractName="CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)")' を設定できません。要素: CompositionTest.Something..ctor (Parameter="foo", ContractName="CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)") --> CompositionTest.Something --> AssemblyCatalog (Assembly="CompositionTest, Version=1.0.0.0, Culture=neutral、PublicKeyToken=null")

結果: エクスポート 'CompositionTest.Something (ContractName="CompositionTest.Something")' をパーツ 'CompositionTest.Something' から取得できません。要素: CompositionTest.Something (ContractName="CompositionTest.Something") --> CompositionTest.Something --> AssemblyCatalog (Assembly="CompositionTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

4

2 に答える 2

1

conventions次の行では、変数を使用してはならないので、変更する必要があります

catalog = new AssemblyCatalog(typeof(FooUser).Assembly, conventions);

catalog = new AssemblyCatalog(typeof(FooUser).Assembly);

ここで使用すると、とが定義されconventionsているアセンブリから事実上何もエクスポートされないため、 の合成値を取得できません。削除すると、エクスポートして構成できるようになります。FooUserSomethingSomethingSomething

于 2014-01-07T19:15:44.907 に答える