0

例外が発生します:1)制約に一致する複数のエクスポートが見つかりました:ContractName CompositionTest.C RequiredTypeIdentity CompositionTest.C

プログラム実行時

名前空間CompositionTest{

// [Export]  // Also doesn't work
[Export(typeof(C))]
public class C  
{
    //[ImportAttribute(AllowRecomposition = true)]  // also doesn't work
    [Import(AllowRecomposition = true)]
    public C PropertyC { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        // Declare a composition container.
        CompositionContainer compositionContainer = new CompositionContainer();

        compositionContainer.ComposeParts( new C() );  

        compositionContainer.ComposeParts( new C() );  // exception here!
    }
}

}

私は何が間違っているのですか?

4

1 に答える 1

2

を初めて呼び出すComposePartsと、新しいCオブジェクトがエクスポートとしてコンテナに追加されます。次に を 2 回目に呼び出すとComposeParts、別のCオブジェクトがエクスポートとして追加されます。インポートには 2 つの部分があり、MEF は判断できないため、インポートに問題が生じます。したがって、カーディナリティの例外です。

1 つの解決策は、インポートを次のように変更することです。

[ImportMany(AllowRecomposition = true)]
public IEnumerable<C> PropertyC { get; set; }

もう 1 つの解決策は、コンテナーの作成時に実際にカタログを使用することです。これは、MEF を使用する一般的な方法です。あなたが見つけることができるほとんどすべての例は、このアプローチに従っています:

//Create a catalog. In this case, a catalog based on an already loaded assembly.
var catalog = new AssemblyCatalog(typeof(C).Assembly);
//Create a container using the catalog. Only the parts from that catalog will be used.
var compositionContainer = new CompositionContainer(catalog);

カタログの詳細については、この記事をお読みください。

ところで、MEF のこのような使用例は今まで見たことがありません。私の答えは、主にデバッグ中に行った観察に基づいています。

于 2013-03-01T13:26:46.370 に答える