首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棱镜: EventAggregator和MEF -2不同的EventAggregator实例

棱镜: EventAggregator和MEF -2不同的EventAggregator实例
EN

Stack Overflow用户
提问于 2011-05-19 12:42:09
回答 1查看 1.5K关注 0票数 5

我有以下设置:

  • 是一个Silverlight应用程序,它被分割成xaps/
  • ,我使用MEF作为DI框架来连接我的应用程序的各个部分。
  • 有两个区域:
  • 1(左)用列表视图(例如,customers)
  • 1(右)填充一个视图,该视图包含一个带有我填充的区域(根据客户的选择)的区域的选项卡控件,而另一个视图包含在一个带有区域的选项卡控件中。

右侧结果:

要填充第一级表控件,我正在侦听“”-(这非常有用),当我收到该事件时,我会使用视图填充第一级选项卡区域:

代码语言:javascript
复制
    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引用。

要在EventsAggregator的SecondLevel ViewModel中获得一个实例,我使用:

代码语言:javascript
复制
  <ImportingConstructor()>
  Public Sub New(ByVal iEvAggregator As IEventAggregator)
          EventAggregator = iEvAggregator
          EventAggregator.GetEvent(Of DoStuffSecondLevel).Subscribe(AddressOf OnDoStuffSecondLevel, True)

   End Sub

我的问题是,我在第二级视图模型中得到的EventAggregator实例与第一级的EventAggregator实例不同,所以如果我在第一级发布DoStuffSecondLevel,就不会在第二级捕捉到它。

为什么我要得到两个不同的EventAggregator实例?

如何在整个应用程序中共享EventAggregator的同一个实例?

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2011-07-06 18:03:48

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

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

代码语言:javascript
复制
protected override void InitializeShell()
{
    base.InitializeShell();

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

    //Etc.
}

WPF (桌面)解决方案:

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6058741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档