1

アプリケーションで MEF を IOC として使用しています。アプリケーション内のクラス (すべてのスレッドで) に対して、一度に 2 つのインスタンスが必要な状況に陥っていることに気付きました。export 属性を別のコンテナー名で 2 回追加し、そのコンテナー名を使用して 2 つのインスタンスを作成するだけで簡単だと思いました。

[Export("Condition-1",typeof(MyClass)]
[Export("Condition-2",typeof(MyClass)]
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.Shared)]
public class MyClass  {   }

そして、それらを次のようにエクスポートします

Container.GetExport<MyClass>("Condition-1").Value
Container.GetExport<MyClass>("Condition-2").Value

しかし、このトリックはうまくいきませんでした。CompsositionBatch を使用して、ようやく問題を解決できました

cb.AddExportedValue<MyClass>("Condition-1",new MyClass());
cb.AddExportedValue<MyClass>("Condition-2",new MyClass());

しかし、私の質問は、契約名に基づいて異なるインスタンスを取得できないのはなぜですか. CreationPolicy が共有されている場合、コントラクト名は関係ないというのは正しいですか?

4

1 に答える 1

0

問題は、PartCreationPolicyAttributeその装飾の設定にありますMyClass

CreationPolicy.Shared は、 への呼び出しごとに 1 つのインスタンスが返されることを意味しますContainer.GetExport。シングルトンのようなものです。あなたの場合に必要なのは、各 clla の異なるインスタンスを に返す CreationPolicy.NonShared ポリシーContainer.GetExportです。

Part Creation Policyに関する優れた記事を次に示します。また、部品の寿命と共有に関する MEF2 の追加については、MEF 2 の ExportFactory を参照してください。

于 2013-03-26T09:19:03.070 に答える