.net - Prism:EventAggregator 和 MEF - EventAggregator 的 2 个不同实例

标签 .net silverlight prism mef eventaggregator

我有以下设置:

  • Silverlight 应用程序拆分
    xaps/模块
  • 我使用 MEF 作为 DI 框架来连接
    我的应用程序的各个部分。
  • 我有 2 个区域:
  • 一个(左边的)填充有
    ListView (例如客户)
  • 一个(右边的)填充有
    一个包含 tabcontrol 的 View
    我居住的地区(根据
    客户被选中)与
    另一个包含选项卡控件的 View
    与一个地区。

    右侧结果:
    enter image description here

  • 为了填充第一级选项卡控件,我正在收听“客户更改事件”-(这很好用),当我收到事件时,我用 View 填充第一级选项卡区域:
        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
    

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

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

    提前致谢

    最佳答案

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

    Silverlight 解决方案(在您的 Bootstrap 中):

    protected override void InitializeShell()
    {
        base.InitializeShell();
    
        //Make the container the default one.
        CompositionHost.Initialize(this.Container);
    
        //Etc.
    }
    

    WPF(桌面)解决方案:

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

    关于.net - Prism:EventAggregator 和 MEF - EventAggregator 的 2 个不同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6058741/

    相关文章:

    .net - WebClient.DownloadFile 在发送第一个请求之前花费的时间太长

    c# - 需要帮助选择接口(interface)名称

    c# - 多个 DataTrigger - Storyboard 被覆盖

    javascript - 当它也具有 runat ="server"时,如何使用 JavaScript 更改 html <param> 值属性

    mvvm - Prism 7 - 将 IContainer 对象注入(inject) View 模型

    wpf - Prism 并单击一次

    wpf - Prismv4 : Microsoft supports it or is it their solution?

    c# - 获取 Tuple<> 项类型的任何方法

    c# - 如何使用简单注入(inject)器模拟模块/安装程序/注册表

    c# - 文本框行为是否正确