使用MEF从Prism 4中的CompositionContainer获取新的Shell实例

时间:2011-10-20 08:50:17

标签: mef prism-4

我在Prism中遇到了一些奇怪的MEF行为,我无法解释。我已经找到了解决方法,我不太满意,所以我真的很想了解是什么导致它。

我已经使用PartCreationPolicy NonShared声明了我的shell窗口类。我正在尝试使用CompositionContainer.GetExportedValue<>()中的MefBootstrapper函数来创建Shell的新实例。

奇怪的是,如果我在创建shell之前调用Container.GetExportedValue<>(),每次调用它时都会得到一个类型为Shell的新对象。但是,一旦初始化了shell,对Container.GetExportedValue<>()的重复调用将返回Shell的相同实例。

就好像shell初始化以某种方式将我的Shell导出重新注册为Shared。

但是,我没有在bootstrapper代码中看到任何明确尝试实现此目的的调用。

任何人都可以解释:

  1. 这种副作用有什么作用
  2. 如何(如果可能)恢复NonShared行为,这样我就可以使用MEF / ServiceLocator创建多个shell。
  3. 干杯,

    标记

2 个答案:

答案 0 :(得分:0)

here是您的多个shell问题的答案。你必须检查NonShared行为是否在那里得到解答。

答案 1 :(得分:0)

我不确定Prism如何使用MEF,但这是一个理论:如何在正常启动时创建shell?我的猜测是,它不是通过从MEF容器调用GetExportedValue,而是通过调用Shell的构造函数,然后通过ComposeParts()或使用CompositionBatch将其添加到容器。以这种方式直接添加到容器中的部件将覆盖目录中可用的部分,并且CreationPolicy也不适用(因为MEF不会创建该部分)。