介绍

在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试。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加载的更多相关文章

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

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

  2. jvm源码解读--01 jvm加载java/lang/object过程

    现在做一下记录,这个看了两天,看的过程发现了很多c++的高级特性,没接触过,还得慢慢撸,禁止很慢 那么现在开始 吧 先打两个断点 java.c:351 JavaMain(void * _args) { ...

  3. 05 flask源码剖析之配置加载

    05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...

  4. 从SpringBoot源码分析 配置文件的加载原理和优先级

    本文从SpringBoot源码分析 配置文件的加载原理和配置文件的优先级     跟入源码之前,先提一个问题:   SpringBoot 既可以加载指定目录下的配置文件获取配置项,也可以通过启动参数( ...

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

    介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...

  6. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  7. 【Spring源码分析】Bean加载流程概览(转)

    转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. ...

  8. Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...

  9. webpack4.X源码解析之懒加载

    本文针对Webpack懒加载构建和加载的原理,对构建后的源码进行分析. 一.准备工作 首先,init之后创建一个简单的webpack基本的配置,在src目录下创建两个js文件(一个主入口文件和一个非主 ...

随机推荐

  1. e代驾狂野裁员 O2O逐渐恢复理智?

    O2O逐渐恢复理智?" title="e代驾狂野裁员 O2O逐渐恢复理智?">     近段时间以来,O2O行业堪称"哀鸿遍野",十分凄惨.巨头 ...

  2. 新浪微博PC端登录分析

    本来给自己定了个2018的目标,平均每月写两篇文章,现在已经快三月了,第一篇稿子才憋出来,惭愧呀,直入主题吧,今天给大家带来的是新浪微博PC端的模拟登陆. 工具 这次使用的工具是Charles和chr ...

  3. JMeter-临界部分控制器

    前言 临界部分控制器根据锁名来控制并发,同一个锁名之下,在同一时间点只能存在一个运行中,适用于控制并发的场景 锁名类型: 锁名为空,认为每个锁为不同的锁 锁名相同,多个锁认为是同一个锁,同一个时间点只 ...

  4. hadoop地址配置、内存配置、守护进程设置、环境设置

    1.1  hadoop配置 hadoop配置文件在安装包的etc/hadoop目录下,但是为了方便升级,配置不被覆盖一般放在其他地方,并用环境变量HADOOP_CONF_DIR指定目录. 1.1.1  ...

  5. 【5min+】保持程序健康的秘诀!AspNetCore的HealthCheck

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...

  6. Newman+Jenkins实现接口自动化测试

    目录 一.是什么Newman 二.如何安装 三.如何使用 1.运行本地文件 2.运行在线文件 3.以node.js库运行 4.导出报告 四.命令行测试真实接口 1.导出collection文件 2.导 ...

  7. PHPRAP 1.0.2 发布,修复安装失败 Bug 和优化细节

    PHPRAP,是一个PHP轻量级开源API接口文档管理系统,致力于减少前后端沟通成本,提高团队协作开发效率,打造PHP版的RAP. 更新记录 [修复]修复在MySQL5.5版本下安装数据初始化sql文 ...

  8. ASP.NET Core 中间件自定义全局异常处理

    目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...

  9. Yuchuan_linux_C 编程之八 文件操作相关函数

    一.整体大纲 st_mode整体介绍: st_mode详细介绍: 二. Linux文件操作相关函数 1. stat 作用:获得文件信息,也可以获取文件大小. 头文件 #include <sys/ ...

  10. SPI总线传输的4种模式

    概述 在芯片的资料上,有两个非常特殊的寄存器配置位,分别是 CPOL (Clock POlarity)和 CPHA (Clock PHAse). CPOL配置SPI总线的极性 CPHA配置SPI总线的 ...