2011-10-20 4 views
1

私は実際に説明することができないPrismのいくつかの奇妙なMEFの動作を見越しています。私はあまりにも幸せではないので、私は本当にそれが原因で何が起こっているのか理解したいと思います。MEFを使ってPrism 4のCompositionContainerから新しいシェルインスタンスを取得する

PartCreationPolicyNonSharedのシェルウィンドウクラスを宣言しました。そして、MefBootstrapperCompositionContainer.GetExportedValue<>()関数を使用して、シェルの新しいインスタンスを作成しようとしています。

シェルが作成される前に私がContainer.GetExportedValue<>()を呼び出すと、私はそれを呼び出すたびにShellという新しいオブジェクトを取得します。ただし、シェルが初期化されると、Container.GetExportedValue<>()への呼び出しを繰り返し実行すると、シェルの同じインスタンスが返されます。

シェルの初期化が何らかの形でシェルのエクスポートを共有として再登録しているかのようです。

しかし、これを明示的に試みるブートストラップコードの呼び出しはありません。

誰が説明することができます:

  1. 何のアクション方法(可能な場合)NonShared動作を復元するために、私はMEF /のServiceLocatorを使用して複数のシェルを作成することができ、この副作用
  2. を持っています。

乾杯、

マーク

+0

ちょっと考えてください。 GetExportedValueがLazyで動作する場合、Lazy.Valueは常に共有されるため、CreationPolicy NonSharedは機能しません。 – blindmeis

+0

これは、シェルを初期化する前に別のインスタンスを取得する理由を説明しません。 – Mark

答えて

0

プリズムがMEFをどのように使用しているかはわかりませんが、ここでは理論があります。通常の起動時にシェルがどのように作成されていますか?私の推測では、MEFコンテナからGetExportedValueを呼び出すのではなく、シェルのコンストラクタを呼び出してから、ComposeParts()またはCompositionBatchを使用してコンテナに追加することになります。その方法でコンテナに直接追加された部分は、カタログで使用可能な部分をオーバーライドし、CreationPolicyは(MEFがその部分を作成していないため)適用されません。

+0

はい、PrismのMEF Bootstrapperが 'ComposeParts'を呼び出したと思います。私はこれの意味を理解していませんでした。 – Mark

0

hereは、あなたの複数のシェル質問に対する答えです。 NonSharedの動作がそこで応答されているかどうかをチェックする必要があります。

+0

私はすでに複数のシェルが動作しています。私の質問は、シェルオブジェクトのインスタンス化に関連しています。 – Mark

関連する問題