如何在模块化应用程序中使用棱镜范围的 RegionManager?

Posted

技术标签:

【中文标题】如何在模块化应用程序中使用棱镜范围的 RegionManager?【英文标题】:How to use prism scoped RegionManager in a modular app? 【发布时间】:2021-06-24 01:08:13 【问题描述】:

在 prism 文档中,以某种方式创建了一个作用域 RegionManager

IRegion detailsRegion = this.regionManager.Regions["DetailsRegion"];
View view = new View();
bool createRegionManagerScope = true;
IRegionManager detailsRegionManager = detailsRegion.Add(view, null, 
                            createRegionManagerScope);

我有一个模块化应用程序,其中 view 位于 另一个模块,而 region 位于 主程序集中。每个模块中都有一些区域,我希望它们具有相同的视图相同的视图然后位于主程序集中。这张图可以更好地解释它:

所以如果我想在模块中使用region.Add 方法,我无法实例化视图,因为它位于主程序集中。

我想到的另一种方法是使用视图发现,即使用RegisterViewWithRegion(string regionName, Type viewType),因为我可以在可以访问viewType 的主程序集中调用此方法,并使用我传递给此方法的regionName在模块中。但问题是模块中不能有同名的区域。

我最终做了我在this answer 中写的内容,但我的经理说我在视图模型中创建RegionManager 违反了 MVVM。

在这种情况下使用作用域RegionManager 的正确方法是什么?

【问题讨论】:

【参考方案1】:

首先,模块视图无关 - 模块是软件的后期绑定、可互换部分。

所以如果我想在模块中使用region.Add 方法,我无法实例化视图,因为它位于主程序集中。

无论如何,你不要打电话给new,因为容器会为你做这件事。

因此,您将工厂注入想要创建视图的类(最简单的方法是Func<View>),然后该类使用工厂来创建视图。在这种情况下,视图或工厂代码所在的位置根本无关紧要,只要您有接口(这与interface 不同,尽管interface 坐在第三个程序集中,它本身没有'不属于任何模块是常见的)在模块可以用来相互交谈的地方。

【讨论】:

以上是关于如何在模块化应用程序中使用棱镜范围的 RegionManager?的主要内容,如果未能解决你的问题,请参考以下文章

棱镜:贝壳之间的导航?

具有多个视图相同 ViewModel 的棱镜导航

棱镜使用发现的服务

wpf的棱镜vs mvvm灯

如何在棱镜中搜索 M 到 N 的关系?

如何在 MVVM 模式中从页面导航到 WPF 中的页面?没有棱镜的概念[重复]