我想构建一个WPF / Prism应用程序,其中每个顶级窗口都在自己的UI线程中。这是相当直接的。我使用Unity作为我的DI容器,并希望创建容器层次结构。在最简单的情况下,根容器将位于应用程序级别,每个窗口将具有子容器。这是可取的,因为每个窗口都可以有自己的子容器作用域的共享对象。
我希望每个窗口都有自己的Prism区域管理器,这样我就没有任何交叉线程问题,因为每个Window都有自己的UI线程。我看到Region和RegionManager使用ServiceLocator.Current单例。这是一个问题,因为我希望RegionManager使用它作为范围的容器,这对于静态单例是不可能的。你有没有遇到这个问题,你会如何解决它?
谢谢!
答案 0 :(得分:0)
您可以将Bootstrapper作为子容器并在那里注册您的类型。并将您的ServiceLocater放在应用程序级别,它将调用您的Bootstrappers。
答案 1 :(得分:0)
我实际上需要做同样的事情,我想出了以下解决方案:
在导航到“子”区域之前,请执行以下操作:
var childRegion = _childRegionManager.Regions["ChildRegion"];
_childRegion.NavigationService = _childContainer.GetExportedValue<IRegionNavigationService>();
_childRegion.NavigationService.Region = _childRegion;
这会在子区域设置正确的导航服务。
当然,childContainer
在其自己的目录中应该有一个IRegionNavigationService
,以便它能够正确地构成它。