5

我有以下设置:

  • 跨 xaps/模块拆分的 Silverlight 应用程序
  • 我使用 MEF 作为 DI 框架来连接我的应用程序的各个部分。

  • 我有2个地区:

  • 一个(左侧)填充了列表视图(例如客户)

  • 一个(右侧)填充了一个包含选项卡控件的视图,该选项卡控件具有我填充的区域(根据选择的客户),另一个视图包含带有区域的选项卡控件。

    右侧结果: 在此处输入图像描述

为了填充第一级选项卡控件,我正在收听“客户更改事件”-(这很好用),当我收到事件时,我用视图填充第一级选项卡区域:

    Dim lReg As IRegion = Me.mRegionManager.Regions("FirstLevelTabReqion")
    Dim lViewID As String = CommonDefinitions.Constants.BuildFirstLevelViewName(lUniqueID)
    Dim lFirstLevelView FirstLevelView = TryCast(lReg.GetView(lRqViewID), FirstLevelView)
    If lFirstLevelView Is Nothing Then     
         lFirstLevelView = New FirstLevelView()
         Dim lRegMan1 As IRegionManager = lReg.Add(lFirstLevelView, lViewID, True)
         lFirstLevelView.SetRegionManager(lRegMan1)
         ...
    End If

注意:创建 FirstLevelView 时,我必须CompositionInitializer.SatisfyImports调用以确保 FirstLevelView 解析其 ViewModel 引用。

要在 SecondLevel ViewModel 中获取 EventsAggregator 的实例,我使用:

  <ImportingConstructor()>
  Public Sub New(ByVal iEvAggregator As IEventAggregator)
          EventAggregator = iEvAggregator
          EventAggregator.GetEvent(Of DoStuffSecondLevel).Subscribe(AddressOf OnDoStuffSecondLevel, True)

   End Sub

我的问题是我在第二级视图模型中获得的 EventAggregator 实例与第一级中的 EventAggregator 实例不同,因此如果我在第一级发布 DoStuffSecondLevel 它将不会在第二级中被捕获。

为什么我会得到 2 个不同的 EventAggregator 实例?
如何在整个应用程序中共享相同的 EventAggregator 实例?

提前致谢

4

1 回答 1

3

问题是 MefBootstrapper 创建了一个 Container 但没有将其注册为 DEFAULT 容器。当调用 SatisfyImports 时,MEF 看不到任何容器,因此它创建一个新容器。这就是实例不同的原因,因为正在创建 2 个不同的容器。要解决此问题,只需将 Prism Container 设置为 MEF 使用的默认容器。

Silverlight 解决方案(在您的引导程序中):

protected override void InitializeShell()
{
    base.InitializeShell();

    //Make the container the default one.
    CompositionHost.Initialize(this.Container);

    //Etc.
}

WPF(桌面)解决方案:

目前,我无法使用桌面解决方案。问题是 MEFExportFactory<T>ComponentInitializer适用于 Silverlight 应用程序(为什么!?)。Glen Block 创建了一个库,可以访问该System.ComponentModel.Composition.Initialization.dll库的桌面版本。我试图使用它,但它失败了,因为在代码中,如果容器已经存在,它被设置为失败......再次,为什么?我还没有尝试在这个解决方案中使用 MEF2(Codeplex 预览),但我想它会更好(也许)。烦人的部分是,如果您选择使用 MEF2 (Codeplex),则必须重新构建 Prism 二进制文件并将 .NET 4 MEF 库的所有引用替换为 Codeplex MEF2 库。这使 Prism 能够毫无怨言地使用 Codeplex MEF2 库。我将尝试看看这样做是否会使这个解决方案在 WPF 中可行。

于 2011-07-06T18:03:48.793 回答