如何在模块化应用程序中使用棱镜范围的 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?的主要内容,如果未能解决你的问题,请参考以下文章