Prism区域和模块化(Region & Module)

发布时间 2023-09-03 15:57:29作者: ZHIZRL

Prism 一直是围绕依赖注入构建的。这有助于您构建可维护和可测试的应用程序,并帮助您减少或消除对静态和循环引用的依赖。

Prism区域概念(Region)

什么是区域(Region)

区域(Region)作为Prism当中模块化的核心功能,其主要目的是弱化了模块与模块之间的耦合关系。在普遍的应用程序开发中,界面上的元素及内容往往被固定。如下图所示:假设应用程序包含Header、Menu、Content内容

因此我们可以为这个页面设计一些元素,例如:

Menu可以设置ListBox;
Content可以放置一个ContentControl;
Header可以放置一些ToolBar; 

prism中,可以不再为其固定内容,从而有了区域的概念;现在,将页面每个部分定于一个唯一区域(Region),那么在运行时,我们可以对每个区域动态设置内容。

定义Region方式(RegionManager)

Prism给出的额区域定义有两种方式:
RegionManager.RegionName(XAML)
RegionManager.SetRegionName(Code) 

第一种:在XAML中定义Region 

运行结果如下所示: 

第二种:在Code中定义Region

RegionManager除了定义区域,还有以下功能:

  • 维护区域集合 public IRegionCollection Regions
  • 提供对区域的访问 regionManager.Regions["Content"];
  • 合成视图 View Composition
  • 区域导航 Region Navigation
  • 定义区域 

区域适配器(RegionAdapter)

实际上,Prism内置了几个区域适配器,所以我们可以在ContentControl当中定义区域,实际可以在任何元素上定义区域,如果定义的范围不在官方提供的默认适配器当中,则会引发异常。

官方提供的适配器类型: 

  • ContentControlRegionAdapter 此适配器适应类型 System.Windows.Controls.ContentControl 和派生类的控件,例如 ContentControl 。
  • SelectorRegionAdapter 该适配器适配从类派生的控件 System.Windows.Controls.Primitives.Selector ,例如 TabControl 控件。
  • ItemsControlRegionAdapter 此适配器适应类型 System.Windows.Controls.ItemsControl 和派生类的控件,例如 Toolbar/Ribbon 控件。

对于如StackPanel等其他控件,区域适配器需要自己编写,编写过程如下:

Prism模块化概念(Module)

什么是模块(Module)

本质上来说,对于一个应用程序而言,特定的所有View、Logic、Service等都可以独立存在。那么意味着,每个独立的功能我们都可以称之为模块。而往往实际上,我们在一个项目当中,他的结构通常是如下所示

所有的模块都在一个项目当中,这使得应用程序当中,我们难以区分单独的模块,他们似乎变成了一个整体。

当我们开始考虑划分模块之间的关系时,采用新的模块化解决方案,他的结构将变成如下所示:

创建模块实例

创建Module实际上是将模块独立与类库存在,模块实现IModule接口,主程序通过加载类库添加模块。以下步骤:

模块生命周期

Prism 中的模块加载过程包括以下顺序:

  • 注册模块(Registering modules) 是通过在类内部实现 IModule 接口来创建的。
  • 发现模块(Discovering modules) 在运行时为特定应用程序加载的模块在模块目录中定义。目录包含有关要加载的模块的信息,例如它们的位置和加载顺序。
  • 加载模块(Loading modules) 包含模块的程序集被加载到内存中。
  • 初始化模块(Initializing modules) 这意味着创建模块类的实例,通过 IModule 接口调用它们的 RegisterTypes 和 OnInitialized 方法,完成模块初始化。 

主程序配置模块目录的方式

  • Code(代码方式)
  • App.config(配置文件)
  • Disk/Directorty(磁盘路径)
  • XAML(XAML定义) 

视图注入(View Injection) 

应用程序模块加载后,每个子模块中的视图可以独立的进行依赖注入。再使用IRegionManager来实现页面导航。

1.利用Region进行导航功能。
2.使用Module将应用程序模块化(若无模块化,则不需要)。
3.将独立模块的视图、服务使用注入到容器中。

依赖注入(Dependency Injection)

Prism项目中的 App 继承于 PrismApplication ,必须要重写 CreateShell() 和 RegisterTypes() 方法,其中 RegisterTypes()用于依赖注入容器,该函数使用 IContainerRegistry 类型的对象将用户自定义的对象注入容器。

依赖注入的几种方法:

  • Register:每一次解析都会创建一个实例
  • RegisterInstance:将一个服务实例注册到容器中
  • RegisterSingleton :整个应用程序生命周期以内只创建一个实例(单例)