MEFを使用してコンストラクタパラメータの注入に関する質問がたくさんあることがわかりましたが、私の場合は少し異なります。MEF:CreationPolicy.NonSharedを使用しているときに、異なるコンストラクタパラメータを渡す
PartCreationPolicy(CreationPolicy.NonShared)
とGetExportedValue
の組み合わせを使用しているときに、異なるパラメータ値を部品のコンストラクタに渡す方法があることを知りたいと思いますか?
例:上記の例で
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export]
public partial class Foo
{
[ImportingConstructor]
public Foo([Import("SomeParam")]object parameter)
{
...
}
}
とどこか...
container.ComposeExportedValue("SomeParam", "Some value...");
var instance = container.GetExportedValue<Foo>();
、私はそれが二度目はChangeRejectedException
の原因となります実行しているように、一度だけComposeExportedValue
を使用することができます。
だから、私の質問は以下のとおりです。
- それぞれの新しいインスタンスのために、上記のシナリオで
SomeParam
の値を変更するための他の方法はありますか? - そうでない場合は、他のDIフレームワークを使用せずにこれを達成できる他の方法は何ですか? 1つ目のことは、
System.Collections.Concurrent.ConcurrentQueue
のようなものを公開するサービスを作成し、GetExportedValue
を呼び出す前にパラメータ値をエンキューしてから、その部分のコンストラクタの値をデキューすることです。しかし、これはハックであり、解決するよりも多くの問題を作り出します。 - 上記の質問に対する答えが「いいえ」の場合、MEFと他のDI/IOCフレームワークの組み合わせでこれを達成する他の方法はありますか?
ありがとうございました。 :)
よろしく、
ヨーゲッシュJagota
の下に表示リポジトリのように、最初の段階で私がAutoFac/MEFの統合で探していますが、 'RegisterComposablePartCatalog'を使用した場合どのように私は登録を扱うことができますか? AutoFacによって自動的に行われるので、私はここで 'Register'を使うことはできません。 AutoFacに '[ImportingConstructor]'を使わずに、私が提供するパラメータを持つデフォルト以外のコンストラクタを使って特定のエクスポートをインスタンス化する必要があることをどのように伝えることができますか? – Yogesh
@Yogesh:(あなたがプラグインの動的検出が必要な場合)あなたは、いくつかのコンポーネントは、(あなたがきめの細かい制御が必要な場合)AutoFacに登録して、MEFでエクスポート他のことができます。しかし、同じコンポーネントに対して両方を混在させることはできません。もう一つの選択肢は、AutoFacに完全に切り替えることです。 [Scanning](http://code.google.com/p/autofac/wiki/Scanning)を使用して、必要に応じてMEFのような動的探索を行うことができます。実際に働いたのは –
です。これを行う方法は、新しい登録を既存のコンテナに追加することを可能にする 'IContainer'の' Update'メソッドを使用することです。ありがとう。 :) – Yogesh