Prism 源码解读3-Modules加载
介绍
在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试。Prism的Modules很好的满足了这一点。

这个架构图很好了讲解了Prism的Modules的概念
Prism支持通过配置文件,文件夹,手动载入Module的方式,并且对Module的载入进行验证,包括重复和循环依赖验证
Prism加载模块的顺序

直接看源码吧
0、Modules加载
- Modules的加载主要依靠ModuleCatalog来发现模块,
- 通过ModuleManager来加载模块并对模块进行验证以确保模块的加载顺序,
- ModuleInitializer负责模块的初始化,包括加载模块所必须的类和显示UI Elements等等。
在Prism.PrismApplicationBase 的Initialize方法中调用

创建目录

RegisterRequiredTypes方法中向容器注入ModuleManager,ModuleInitializer,

最后调用了InitializeModules方法,并在其中调用了ModuleManager的Run方法

看着两个名字就明白了,第一个是发现模块并验证模块,第二个是加载模块并初始化。

看一下ModuleCatalogBase的Initialize方法,果然


而验证就更加有意思了

重复性验证

通过模块名字ModuleNames来判断是否被加载过,,如果存在就抛出异常
加载顺序验证

同时看一下ModuleBase

每当items发生变化都会进行验证


发现验证完了来看一下ModuleManage的LoadModulesWhenAvailable方法




看到最终使用了ModuleInitializer来初始化Module。其过程通过Linq实现延迟加载技术。

在这个方法中发现Module必须实现IModle接口。并在这儿调用了RegisterTypes和OnInitialized方法。
模块的加载看完了,下面来看例子吧
1、通过AppSetting加载
先看一下配置文件

在初始化时

看到重写了CreateModuleCatalog,前面已经介绍过ModuleCatalog就是控制Module发现和验证的。



可以看到section的名称必须是modules。
先解析Module依赖逻辑,最后调用AddModule方法

再ModuleAModule中载入相关的UIElement。
2、通过代码加载
通过代码加载就更简单了,直接在ConfigureModuleCatalog方法中调用默认的ModuleCatalog加载相关的Module就可以了。

在ModuleAModule中代码不变
这其中的逻辑在0节中已经解释清楚了,就不在叙述。
3、通过目录加载
通过目录加载,如果不看源码怎么设计,需要创建一个ModuleCatalog,在创建的时候将目录地址传入。在内部InnerLoad方法中找到对应目录,然后通过遍历程序集找到实现IModule接口的类,加载这个类就可以了。
看了下源码也正是这么做的


看了源码发现官方考虑了更多的问题,比如创建了AppDoamin来加载程序集以保证隔离和数据安全。甚至还为其创建了一个InnerModuleInfoLoader类来反射程序集

这样的指责分配非常好,我们甚至可以写一个通过网络来加载Module的ModuleCatalog类。
4、通过手动方式加载

先在ConfigureModuleCatalog中将所有的Module加载进来,并将InitializationMode的方式设置为按需,

那么就可以在需要的时候利用LoadModule方法载入之前加载的Module


值得注意的是并没有提供卸载Module的接口。
总结
这一篇介绍了下Modules加载的原理,其实就是
- ModuleCatalog负责发现Module。
- 通过ModuleManager来加载模块并对模块进行验证以确保模块的加载顺序,
- ModuleInitializer负责模块的初始化,包括加载模块所必须的类和显示UI Elements等等。
下一篇开始将介绍MVVM的实现。
Prism 源码解读3-Modules加载的更多相关文章
- Prism 源码解读2-View的加载和控制
介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制. 4.ViewDiscovery 在创建好Region后需要将View添加到Region中. ...
- jvm源码解读--01 jvm加载java/lang/object过程
现在做一下记录,这个看了两天,看的过程发现了很多c++的高级特性,没接触过,还得慢慢撸,禁止很慢 那么现在开始 吧 先打两个断点 java.c:351 JavaMain(void * _args) { ...
- 05 flask源码剖析之配置加载
05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...
- 从SpringBoot源码分析 配置文件的加载原理和优先级
本文从SpringBoot源码分析 配置文件的加载原理和配置文件的优先级 跟入源码之前,先提一个问题: SpringBoot 既可以加载指定目录下的配置文件获取配置项,也可以通过启动参数( ...
- Prism 源码解读1-Bootstrapper和Region的创建
介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...
- 【Spring源码分析】Bean加载流程概览
代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...
- 【Spring源码分析】Bean加载流程概览(转)
转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. ...
- Spring源码分析:Bean加载流程概览及配置文件读取
很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...
- webpack4.X源码解析之懒加载
本文针对Webpack懒加载构建和加载的原理,对构建后的源码进行分析. 一.准备工作 首先,init之后创建一个简单的webpack基本的配置,在src目录下创建两个js文件(一个主入口文件和一个非主 ...
随机推荐
- 关于android应用程序的入口
android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...
- 2016/11/10 吃吃喝喝Hacking Thursday Night聚餐活动 at Dunkin Donuts
店名:Dunkin Donuts 唐恩都乐 点评:http://www.dianping.com/shop/21378231 地址:静安区南京西路1649号静安公园内(近静安公园) 走法:地铁2号线静 ...
- CS229 Lesson 5 生成学习算法
课程视频地址:http://open.163.com/special/opencourse/machinelearning.html 课程主页:http://cs229.stanford.edu/ 更 ...
- YOLO 论文阅读
YOLO(You Only Look Once)是一个流行的目标检测方法,和Faster RCNN等state of the art方法比起来,主打检测速度快.截止到目前为止(2017年2月初),YO ...
- 8——PHP循环结构&&条件结构
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 前端每日实战:60# 视频演示如何用纯 CSS 创作一块乐高积木
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qKKqrv 可交互视频 此视频是可 ...
- 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZRjGGy 可交互视频 此视频是可 ...
- C++ 命令行窗口打印二叉树(图形)
写这个程序的目的是学习数据结构的时候方便调试,学习起来也比较直观. 这个是我测试SplayTree时候的gif STEP 1 新建一个头文件,命名为DrawATree.hh, 将以下内容复制进去 #i ...
- 【Java必修课】判断String是否包含子串的四种方法及性能对比
1 简介 判断一个字符串是否包含某个特定子串是常见的场景,比如判断一篇文章是否包含敏感词汇.判断日志是否有ERROR信息等.本文将介绍四种方法并进行性能测试. 2 四种方法 2.1 JDK原生方法St ...
- Python数据科学手册(1) IPython:超越Python
1.1 shell还是Notebook Jupyter Notebook 是 IPython shell 基于浏览器的图形界面,提供了一系列丰富的动态展示功能.Jupyter Notebook 不仅可 ...