【问题标题】:Prism, ServiceLocator and Unity container hierarchy and multi-window WPF applicationPrism、ServiceLocator 和 Unity 容器层次结构和多窗口 WPF 应用程序
【发布时间】:2011-07-28 00:27:38
【问题描述】:

我想构建一个 WPF/Prism 应用程序,其中每个顶级窗口都位于其自己的 UI 线程中。这是相当直截了当的。我使用 Unity 作为我的 DI 容器,并希望创建容器层次结构。在最简单的情况下,根容器将位于应用程序级别,每个窗口都有一个子容器。这是可取的,因为每个窗口都可以有自己的共享对象,由子容器限定。

我希望每个窗口都有自己的 Prism 区域管理器,这样我就不会有任何跨线程问题,因为每个窗口都有自己的 UI 线程。我看到 Region 和 RegionManager 使用 ServiceLocator.Current 单例。这是一个问题,因为我希望 RegionManager 使用它所限定的容器,而静态单例是不可能的。你们中有人遇到过这个问题吗?如何解决?

谢谢!

【问题讨论】:

  • 使用ServiceLocator 仅解析特定对象。如果您不需要在每个窗口的基础上覆盖这些,我相信您可以让睡狗撒谎。您是否发现您需要覆盖?
  • 看来我需要覆盖这些,以便每个窗口都有一个区域导航服务和区域管理器和区域注册表。由于它使用 ServiceLocator Singleton,我看不出有一种方法可以使其与当前设计一起使用。
  • 我相信这是一个与原始问题不同的问题。见这里:stackoverflow.com/questions/5276984/…

标签: wpf unity-container prism prism-4


【解决方案1】:

您可以将您的引导程序作为子容器并在那里注册您的类型。并将您的 ServiceLocater 放在将调用您的引导程序的应用程序级别。

更多信息; http://msdn.microsoft.com/en-us/library/ff649077.aspx

【讨论】:

    【解决方案2】:

    我实际上需要做同样的事情,我想出了以下解决方案:

    在导航到“子”区域之前,请执行以下操作:

    var childRegion = _childRegionManager.Regions["ChildRegion"];            
    _childRegion.NavigationService = _childContainer.GetExportedValue<IRegionNavigationService>();
    _childRegion.NavigationService.Region = _childRegion;
    

    这会在子区域上设置正确的导航服务。

    当然,childContainer 在它自己的目录中应该有一个IRegionNavigationService,这样它才能正确地组合它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 2019-05-04
      • 1970-01-01
      • 2014-11-17
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多