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 :整个应用程序生命周期以内只创建一个实例(单例)