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

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

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

杜金锋   2020-03-29 我要评论
## 介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求,其主要用于WPF和Xamarin,用于构建松耦合,可维护,可测试的应用程序框架,在我看到源码后也深受启发,欢迎大家一起交流探讨。 ## 开始 我将从官方的Samples的顺序,看介绍中的每个功能是怎么实现的。 ## 0、PrismApplicationBase 首先介绍一下这个类,这是Startup,这个类中构建了所有的Prism功能和整体的框架。这个类中大多数的方法都是虚方法,可以重载加入自定义的一些功能,Prism也希望我们如此进行设计。 在整个Prism中,UnityContainer无处不再,它就是一个大的容器,保存着所有类,在需要的时候Resolver出来。 ![1585470691950](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843731-1366169079.png) 有两个字段,ContainerExtension就UnityContainer,当然也可以自定义其他的容器,在文章中都默认为UnityContainer容器,关于容器也给一个官方说明 ![](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183943166-301193197.png) ModuleCatalog是定义了加载Module的方式,模块是Prism的一大优势,给一张官方说明,意图胜千言 ![](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183955778-1658154778.png) 所有的一切都是从一个类开始PrismApplicationBase,在这个类中加载了Prism的所有功能。 ![1585471475741](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843755-210210455.png) 看一下最重要的一个方法,正是在这个方法中完成了大部分功能,其主要工作就是将基础架构模块,RequireTypes,RegionAdapterMappings,RegionBehaviors,注入到相应的容器中。 下面几个方法感受一下 ![1585471851178](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843757-1844773667.png) ![1585471862192](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843759-1242946447.png) ![1585471872010](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843756-1951097860.png) ![1585471899983](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843758-98582669.png) ![1585471908276](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843758-1036488313.png) 在PrismApplicationBase的子类中看一下 ![1585472041462](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843758-390153955.png) 正如我前面所说,重写某个方法,先调用Base.Method,然后再加入自己功能 对于开发者来说必须重写的就两个方法 ![1585472248282](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843759-364891009.png) 创建主窗体和RegisterTypes方法,在第二个方法里可以加入我们所必须的一些基础构建,ContainerRegistry其实就是注册的Unity容器 ![1585472365902](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843765-1574104925.png) 下面让我们愉快的看例子吧。例子都在Prism-Samples-Wpf-master中一共29个, ## 1、BootstrapperShell ![1585472950515](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843768-826881994.png) ![1585472994216](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843769-1602862462.png) 看着就是创建了一个Bootstraper然后Run了一下,通过容器创建了主窗体,Show了一下。 看一下如何实现的,其实文章都是在Bootstrapper中 ![1585473149592](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843777-171289544.png) 看到这两个类是不是有一种恍然大悟的感觉,原来Bootstrapper是啥?就是将PrismApplicationBase中的方法全部从Application中抽出来,在这重新实现了一下,难道这就是单一职责原则? 来看一下Run,这些方法太熟悉了吧。 ![1585473531825](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843801-57836246.png) 日志怎么用,当然是创建然后记录了,所有的信息都放到资源里,创建的方式有很多种,选择最简单的一种new, ![1585473705313](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843809-1804681604.png) ## 2、Regions 这个就是简单的创建一个Region ![1585473969090](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843870-1213234843.png) 一目了然啊,就是在ContentControl中用RegionManager的依赖属性创建的一个Region。 用经典的三个问题来看看RegionManager,你是谁,你从哪里来,要到哪里去。 ![1585474161899](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843836-786618718.png) 哦!小伙子你很张狂啊,很强大。看一眼把关了就可以了。 看一眼知道了有一个RegionName依赖属性,当这个属性变化的时候调用 ![1585474975966](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843876-967415529.png) IsInDesignMode就是判断是否在VS的设计模式,调用 ![1585475107593](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843848-592938697.png) 哦,还是用了延迟加载,还是用容器创建的,Prism里几乎所有的类都是通过容器创建的 ![1585475296411](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843891-1669091631.png) Behavior?WPF里面的行为就是服务啊,就是先把一个依赖属性存着,需要的时候盘它。去看看 ![1585475415828](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843875-270788873.png) 很标准的服务。 ![1585475467136](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843960-1756625260.png) 使用了弱引用,很棒的设计,想想也是如此, ![1585475585421](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843904-2017682977.png) ![1585475621940](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843964-1592186379.png) 通过Load事件实现延迟加载,嗯,很棒,在界面载入的时候创建Region。 ![1585475679204](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843914-1477101309.png) ![1585475701564](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843968-1481766810.png) 载入触发一次就好。很喜欢这个单词WireUp,缠绕,UnWire, ![1585475877997](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843917-1909300604.png) ![1585476017158](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843986-1186011032.png) 通过名字创建,到RegionAdapterMapping中找到RegionAdapter然后通过Adapter的Initialize创建。 ![1585476694306](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843935-1961386005.png) RegionAdapterMapping就是RegionAdapter的集合 ![1585476749370](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843991-2012153352.png) ![1585478744531](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329184659954-349255275.png) ![1585476852940](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183844136-420304392.png) 先创建Region,然后添加行为 ![1585477085692](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843954-1355413187.png) ![1585476992679](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183844180-1989643537.png) 都有哪些行为呢? ![1585477032237](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843972-1682608544.png) 创建Region工作完成啦。 看看官方文档关于Region ![](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329184032553-1557239280.png) ## 3、CustomRegions 想要自定义一个Regin,那肯定要创建一个RegionAdapter,自定义一个StackPanelRegionAdapter ![1585477844435](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183844208-1493010180.png) ![1585477898475](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183843991-1745022676.png) ![1585477950980](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200329183844507-270770031.png) 通过刚刚的源码解读这些理解起来好像都不困难了。 ## 总结 通过源码探索了下Bootstapper,Region的创建及如何自定义一个RegionAdapter,轻轻揭开了Prism一点点面纱。后面还有很多的功能和想法,欢迎大家和我一起探讨学习。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们