Prism 源码解读1-Bootstrapper和Region的创建
介绍
之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求,其主要用于WPF和Xamarin,用于构建松耦合,可维护,可测试的应用程序框架,在我看到源码后也深受启发,欢迎大家一起交流探讨。
开始
我将从官方的Samples的顺序,看介绍中的每个功能是怎么实现的。
0、PrismApplicationBase
首先介绍一下这个类,这是Startup,这个类中构建了所有的Prism功能和整体的框架。这个类中大多数的方法都是虚方法,可以重载加入自定义的一些功能,Prism也希望我们如此进行设计。
在整个Prism中,UnityContainer无处不再,它就是一个大的容器,保存着所有类,在需要的时候Resolver出来。

有两个字段,ContainerExtension就UnityContainer,当然也可以自定义其他的容器,在文章中都默认为UnityContainer容器,关于容器也给一个官方说明

ModuleCatalog是定义了加载Module的方式,模块是Prism的一大优势,给一张官方说明,意图胜千言

所有的一切都是从一个类开始PrismApplicationBase,在这个类中加载了Prism的所有功能。

看一下最重要的一个方法,正是在这个方法中完成了大部分功能,其主要工作就是将基础架构模块,RequireTypes,RegionAdapterMappings,RegionBehaviors,注入到相应的容器中。
下面几个方法感受一下





在PrismApplicationBase的子类中看一下

正如我前面所说,重写某个方法,先调用Base.Method,然后再加入自己功能
对于开发者来说必须重写的就两个方法

创建主窗体和RegisterTypes方法,在第二个方法里可以加入我们所必须的一些基础构建,ContainerRegistry其实就是注册的Unity容器

下面让我们愉快的看例子吧。例子都在Prism-Samples-Wpf-master中一共29个,https://github.com/PrismLibrary/Prism-Samples-Wpf
1、BootstrapperShell


看着就是创建了一个Bootstraper然后Run了一下,通过容器创建了主窗体,Show了一下。
看一下如何实现的,其实文章都是在Bootstrapper中

看到这两个类是不是有一种恍然大悟的感觉,原来Bootstrapper是啥?就是将PrismApplicationBase中的方法全部从Application中抽出来,在这重新实现了一下,难道这就是单一职责原则?
来看一下Run,这些方法太熟悉了吧。

日志怎么用,当然是创建然后记录了,所有的信息都放到资源里,创建的方式有很多种,选择最简单的一种new,

2、Regions
这个就是简单的创建一个Region

一目了然啊,就是在ContentControl中用RegionManager的依赖属性创建的一个Region。
用经典的三个问题来看看RegionManager,你是谁,你从哪里来,要到哪里去。

哦!小伙子你很张狂啊,很强大。看一眼把关了就可以了。
看一眼知道了有一个RegionName依赖属性,当这个属性变化的时候调用

IsInDesignMode就是判断是否在VS的设计模式,调用

哦,还是用了延迟加载,还是用容器创建的,Prism里几乎所有的类都是通过容器创建的

Behavior?WPF里面的行为就是服务啊,就是先把一个依赖属性存着,需要的时候盘它。去看看

很标准的服务。

使用了弱引用,很棒的设计,想想也是如此,


通过Load事件实现延迟加载,嗯,很棒,在界面载入的时候创建Region。


载入触发一次就好。很喜欢这个单词WireUp,缠绕,UnWire,


通过名字创建,到RegionAdapterMapping中找到RegionAdapter然后通过Adapter的Initialize创建。

RegionAdapterMapping就是RegionAdapter的集合



先创建Region,然后添加行为


都有哪些行为呢?

创建Region工作完成啦。
看看官方文档关于Region

3、CustomRegions
想要自定义一个Regin,那肯定要创建一个RegionAdapter,自定义一个StackPanelRegionAdapter



通过刚刚的源码解读这些理解起来好像都不困难了。
总结
通过源码探索了下Bootstapper,Region的创建及如何自定义一个RegionAdapter,轻轻揭开了Prism一点点面纱。后面还有很多的功能和想法,欢迎大家和我一起探讨学习。
Prism 源码解读1-Bootstrapper和Region的创建的更多相关文章
- Prism 源码解读2-View的加载和控制
介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制. 4.ViewDiscovery 在创建好Region后需要将View添加到Region中. ...
- Prism 源码解读3-Modules加载
介绍 在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试.Prism的Modules很好的满足了这一点. 这个架构图很好了讲解了Prism的Modules的概念 Prism支持 ...
- Prism 源码解读5-数据绑定和命令
介绍 WPF本身就支持通知.绑定和命令,实现ViewModel和VIew之间的通讯,但相对来说功能比较少,Prism扩充了这些功能并提供更加强有力,简洁的数据绑定和命令. 0 绑定通知 WPF的绑定通 ...
- Prism 源码解读7-导航
介绍 Prism提供了一个非常强大的功能导航,导航的意思就是指定对应的View显示.这个导航的强大之处有: 可以设置导航前后的动作 可以指定View实例的生命周期,可以是否导航到新的View实例 提供 ...
- Prism 源码解读4-ViewModel注入
介绍 介绍一个Prism的MVVM实现,主要介绍Prism如何在WPF上进行的一些封装,以实现MVVM.MVVM到底是什么呢?看一下这一幅经典的图 以前没有ViewModel这个概念,就是将Model ...
- Prism 源码解读6-事件聚合
0 介绍 事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用.同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者.如果代码中事件很多就会充斥着各种事件的订阅 ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- SDWebImage源码解读 之 NSData+ImageContentType
第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...
- SDWebImage源码解读 之 UIImage+GIF
第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...
随机推荐
- The difference between applicationContext.xml in Spring and xxx-servlet.xml in SpringMVC
一直搞不明白两者的区别.如果使用了SpringMVC,事实上,bean的配置完全可以在xxx-servlet.xml中进行配置.为什么需要applicationContext.xml?一定必须? 因为 ...
- 有关PHP的可变函数
事情的起因是这样子的,最近看到一道题,问的是 <?php $_POST['a']($_POST['b']);?> 这句代码有什么问题,答案很明显因为PHP的可变函数这个特性,导致了任意代码 ...
- LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...
- 超全!python的文件和目录操作总结
文件的基本读写 path = r'C:\Users\Brady\Documents\tmp' with open(path + r'\demo.txt', 'r', encoding='utf-8') ...
- k8s环境部署本地.net core web项目
上一篇文章,我们部署了docker+k8s环境,简单测试通过,但是,还没能将我们自己的项目部署上去,继续记录部署踩坑过程. 一.准备工作 1.当然是docker+k8s环境了,详情请看上一篇文档 ht ...
- Ubuntu 18.04安装搜狗输入法
Ubuntu 18.04安装搜狗输入法 打开 terminal,输入 fcitx,检查是否安装搜狗输入法依赖,若提示未安装使用以下命令安装 sudo apt-get install fcitx-bin ...
- JS 获取一段时间内的工作时长小时数
本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ...
- 基于Modelsim的直方图统计算法仿真
一.前言 本篇主要针对牟新刚编著<基于FPGA的数字图像处理及应用>第六章第五节中直方图统计相关类容进行总结,包括代码实现及 基于Modelsim的仿真.书读百遍,其意自现. 2020-0 ...
- 如何优雅的把后台数据(通常是JSON)轻松渲染到html页面
如何优雅的把后台数据(通常是JSON)轻松渲染到html页面 在我们做前后端分离的时候,都有遇到过一些看起卡很简答,确无从下手的问题把.比方说后台给了前端一个list集合,集合里面有很多学生,我们现在 ...
- python笔记28(TCP,UDP,socket协议)
今日内容 1.TCP协议 协议的特点:三次握手,四次挥手: 2.UDP协议 3.OSI七层模型:每层的物理设备,每一层协议. 4.代码部分: ①介绍socket: ②使用socket完成tcp协议的w ...