2011-10-20 81 views
1

我在Prism中遇到了一些奇怪的MEF行爲,我無法真正解釋它。我找到了解決辦法,我不太滿意,所以我很想知道是什麼原因造成的。從棱鏡4中的CompositionContainer中獲取一個新的Shell實例MEF

我宣佈我的shell窗口類的PartCreationPolicyNonShared。我試圖用我的MefBootstrapper中的CompositionContainer.GetExportedValue<>()函數來創建一個新的Shell實例。

奇怪的是,如果我在創建shell之前調用Container.GetExportedValue<>(),那麼每次我調用它時,都會得到一個新的對象Shell。但是,一旦shell已經初始化,重複調用Container.GetExportedValue<>()就會返回Shell的同一個實例。

就好像shell初始化以某種方式重新註冊我的Shell導出爲Shared。

但是,我沒有看到明確嘗試實現這一目的的引導程序代碼中的任何調用。

誰能解釋:

  1. 什麼動作都有這種副作用
  2. 如何(如果可能)恢復NonShared行爲,這樣我就可以創建一個使用MEF /服務定位多發炮彈。

乾杯,

馬克

+0

只是一些想法。如果GetExportedValue與Lazy協同工作,那麼您的CreationPolicy NonShared將不起作用,因爲Lazy.Value總是被共享。 – blindmeis

+0

這並不能解釋爲什麼我在初始化shell之前得到不同的實例。 – Mark

回答

0

我不確定棱鏡如何使用MEF,但這裏有一個理論:在正常啓動時如何創建shell?我的猜測是,它不是通過從MEF容器調用GetExportedValue,而是通過調用Shell的構造函數,然後通過ComposeParts()或使用CompositionBatch將其添加到容器中。以這種方式直接添加到容器的部分將覆蓋目錄中可用的部分,並且CreationPolicy也不會應用(因爲MEF不會創建該部分)。

+0

是的,我認爲Prism中的MEF Bootstrapper調用'ComposeParts'。我沒有意識到這一點的含義。 – Mark

0

here是您的多個殼問題一個答案。你必須檢查NonShared行爲是否在那裏得到回答。

+0

我有多個shell已經工作。我的問題涉及shell對象的實例化。 – Mark