Prism 源码解读1-Bootstrapper和Region的创建

原文:Prism 源码解读1-Bootstrapper和Region的创建

目录

  • 介绍
  • 开始
  • 0、PrismApplicationBase
  • 1、BootstrapperShell
  • 2、Regions
  • 3、CustomRegions
  • 总结


回到顶部

介绍

之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求,其主要用于WPF和Xamarin,用于构建松耦合,可维护,可测试的应用程序框架,在我看到源码后也深受启发,欢迎大家一起交流探讨。

Prism的整体架构

回到顶部

开始

我将从官方的Samples的顺序,看介绍中的每个功能是怎么实现的。

Github地址

回到顶部

0、PrismApplicationBase

首先介绍一下这个类,这是Startup,这个类中构建了所有的Prism功能和整体的框架。这个类中大多数的方法都是虚方法,可以重载加入自定义的一些功能,Prism也希望我们如此进行设计。

在整个Prism中,UnityContainer无处不再,它就是一个大的容器,保存着所有类,在需要的时候Resolver出来。

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

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

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

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

下面几个方法感受一下

在PrismApplicationBase的子类中看一下

正如我前面所说,重写某个方法,先调用Base.Method,然后再加入自己功能

对于开发者来说必须重写的就两个方法

这个Shell就是主窗体,窗体的构成Prism的窗体都是由一个个Region构成,每个Region中都包含若干个View

创建主窗体和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,

BootStrapper的主要职责

回到顶部

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一点点面纱。后面还有很多的功能和想法,欢迎大家和我一起探讨学习。

原文地址:https://www.cnblogs.com/lonelyxmas/p/12603239.html

时间: 2024-10-06 00:16:20

Prism 源码解读1-Bootstrapper和Region的创建的相关文章

Prism 源码解读3-Modules加载

原文:Prism 源码解读3-Modules加载 目录 介绍 0.Modules加载 1.通过AppSetting加载 2.通过代码加载 3.通过目录加载 4.通过手动方式加载 总结 回到顶部 介绍 在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试.Prism的Modules很好的满足了这一点. 这个架构图很好了讲解了Prism的Modules的概念 Prism支持通过配置文件,文件夹,手动载入Module的方式,并且对Module的载入进行验证,包括重复和循环依赖验证

Prism 源码解读2-View的加载和控制

介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制. 4.ViewDiscovery 在创建好Region后需要将View添加到Region中.先补充几个概念 在上一篇将了如何创建Region,现在让我们看看Region类是什么 private ViewsCollection views; private ViewsCollection activeViews; 这是一个View集合,集合改变会触发CollectionChanged事件 其

Prism 源码解读6-事件聚合

0 介绍 事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用.同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者.如果代码中事件很多就会充斥着各种事件的订阅,不利于维护. Prism提供了EventAggregator器,可以在任何地方进行订阅,任何地方进行调用/发布,实例只对EventAggregator和事件类型有依赖,使用了弱引用,可以过滤消息,并可以控制回调函数线程.感觉很强大,实现应该挺复杂,但看到实现时有一种恍然大悟的感觉,喜欢这种简单而强

《Prism 5.0源码走读》Bootstrapper

Prism框架需要在应用程序启动的时候进行一些初始化的工作,Bootstrapper就是来做这些的,是其切入点. Bootstrapper主要要做的事有:创建和配置module catalog,创建DI Container,为UI配置默认的region适配器,创建和初始化shell以及初始化module. /// <summary> /// Base class that provides a basic bootstrapping sequence and hooks /// that sp

OpenCV2马拉松第27圈——SIFT论文,原理及源码解读

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28913101 简介 SIFT特征描述子是David G. Lowe 在2004年的ijcv会议上发表的论文中提出来的,论文名为<<Distinctive Image Featuresfrom Scale-Invariant Keypoints>>.这是一个很强大的算法,主要用于图像配准和物体识别等领域,但是其计算量相比也比较大,性价

QCustomplot使用分享(二) 源码解读

一.头文件概述 从这篇文章开始,我们将正式的进入到QCustomPlot的实践学习中来,首先我们先来学习下QCustomPlot的类图,如果下载了QCustomPlot源码的同学可以自己去QCustomPlot的目录下documentation/qcustomplot下寻找一个名字叫做index.html的文件,将其在浏览器中打开,也是可以找到这个库的类图.如图1所示,是组成一个QCustomPlot类图的可能组成形式. 一个图表(QCustomPlot):包含一个或者多个图层.一个或多个ite

vue源码解读预热-0

vueJS的源码解读 vue源码总共包含约一万行代码量(包括注释)特别感谢作者Evan You开放的源代码,访问地址为Github 代码整体介绍与函数介绍预览 代码模块分析 代码整体思路 总体的分析 从图片中可以看出的为采用IIFE(Immediately-Invoked Function Expression)立即执行的函数表达式的形式进行的代码的编写 常见的几种插件方式: (function(,){}(,))或(function(,){})(,)或!function(){}()等等,其中必有

SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系

一般我们开发时,使用最多的还是@RequestMapping注解方式. @RequestMapping(value = "/", param = "role=guest", consumes = "!application/json") public void myHtmlService() { // ... } 台前的是RequestMapping ,正经干活的却是RequestCondition,根据配置的不同条件匹配request. @Re

jdk1.8.0_45源码解读——HashMap的实现

jdk1.8.0_45源码解读——HashMap的实现 一.HashMap概述 HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是<key,value>对的映射,允许多个null值和一个null键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变.  除了HashMap是非同步以及允许使用null外,HashMap 类与 Hashtable大致相同. 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能.迭代col