介绍

之前也研究过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的创建的更多相关文章

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

    介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制. 4.ViewDiscovery 在创建好Region后需要将View添加到Region中. ...

  2. Prism 源码解读3-Modules加载

    介绍 在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试.Prism的Modules很好的满足了这一点. 这个架构图很好了讲解了Prism的Modules的概念 Prism支持 ...

  3. Prism 源码解读5-数据绑定和命令

    介绍 WPF本身就支持通知.绑定和命令,实现ViewModel和VIew之间的通讯,但相对来说功能比较少,Prism扩充了这些功能并提供更加强有力,简洁的数据绑定和命令. 0 绑定通知 WPF的绑定通 ...

  4. Prism 源码解读7-导航

    介绍 Prism提供了一个非常强大的功能导航,导航的意思就是指定对应的View显示.这个导航的强大之处有: 可以设置导航前后的动作 可以指定View实例的生命周期,可以是否导航到新的View实例 提供 ...

  5. Prism 源码解读4-ViewModel注入

    介绍 介绍一个Prism的MVVM实现,主要介绍Prism如何在WPF上进行的一些封装,以实现MVVM.MVVM到底是什么呢?看一下这一幅经典的图 以前没有ViewModel这个概念,就是将Model ...

  6. Prism 源码解读6-事件聚合

    0 介绍 事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用.同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者.如果代码中事件很多就会充斥着各种事件的订阅 ...

  7. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  8. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  9. SDWebImage源码解读 之 UIImage+GIF

    第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...

随机推荐

  1. 添砖加瓦:Linux系统监测

    前言 前段时间因为项目需求,需要实时获取系统当前的运行状态,遂查阅了不少资料,基于/proc目录下的部分文件,实现了系统CPU.内存.网络和磁盘的实时监测. 一.CPU使用情况获取 获取CPU使用情况 ...

  2. 【问】:和=在map里面的区别

  3. 使用Lucene.Net做一个简单的搜索引擎-全文索引

    Lucene.Net Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎. ...

  4. Nuts.js01

    1.简介 Vue ssr框架.支持vue2,vue-router,vuex,vue server render, vue meta 2.基本使用: vue init nuxt-community/ko ...

  5. 盒马微信小程序

    盒马app刚出现,就吸足了眼球.最近看了看盒马界面,很Q,就想着仿照app写个小程序. 功能介绍 好奇微信小程序是如何制作的,也对盒马app感兴趣,就尝试写了这个盒马小程序.实现了app的部分功能,还 ...

  6. Error response:/usr/bin/tf_serving_entrypoint.sh: line 3: 6 Illegal instruction (core dumped) ...

    用docker部署tensorflow-serving:gpu时,参照官方文档:https://tensorflow.google.cn/tfx/serving/docker 本应该是很简单的部署,没 ...

  7. 阿里云上docker部署nginx实现反向代理

    简介   需要从镜像仓库找到所需要的nginx版本pull下来.(地址:https://hub.docker.com/) 1.docker pull nginx 1.挂载目录 1.1 获取nginx. ...

  8. Vue项目一、node.js和npm的安装和环境搭建

    一.为什么安装node.js及npm npm npm是Node.js的包管理工具(package manager),是全球最大的生态系统,同过npm可以找到很多丰富的插件来满足项目的需求. a1.现在 ...

  9. Java基础面试系列(一)

    Java基础面试总结(一) 1. 面向对象和面向过程的区别 面向过程 面向对象 性能 高于面向对象 类加载的时候需要实例化,比较消耗资源 三易(易维护,易复用,易扩展) 不如面向对象 具有封装,继承, ...

  10. NoVNC安装部署

    noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算.虚拟机控制面板中,比如 Op ...