Prism 源码解读3-Modules加载

原文:Prism 源码解读3-Modules加载

目录

 


回到顶部

介绍

在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试。Prism的Modules很好的满足了这一点。

Prism 源码解读3-Modules加载

这个架构图很好了讲解了Prism的Modules的概念

Prism支持通过配置文件,文件夹,手动载入Module的方式,并且对Module的载入进行验证,包括重复和循环依赖验证

Prism加载模块的顺序

Prism 源码解读3-Modules加载

直接看源码吧

回到顶部

0、Modules加载

  • Modules的加载主要依靠ModuleCatalog来发现模块,
  • 通过ModuleManager来加载模块并对模块进行验证以确保模块的加载顺序,
  • ModuleInitializer负责模块的初始化,包括加载模块所必须的类和显示UI Elements等等。

在Prism.PrismApplicationBase 的Initialize方法中调用

Prism 源码解读3-Modules加载

创建目录

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

看一下ModuleCatalogBase的Initialize方法,果然

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

而验证就更加有意思了

Prism 源码解读3-Modules加载

重复性验证

Prism 源码解读3-Modules加载

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

加载顺序验证

Prism 源码解读3-Modules加载

同时看一下ModuleBase

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

在这个方法中发现Module必须实现IModle接口。并在这儿调用了RegisterTypes和OnInitialized方法。

模块的加载看完了,下面来看例子吧

回到顶部

1、通过AppSetting加载

先看一下配置文件

Prism 源码解读3-Modules加载

在初始化时

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

可以看到section的名称必须是modules。

先解析Module依赖逻辑,最后调用AddModule方法

Prism 源码解读3-Modules加载

再ModuleAModule中载入相关的UIElement。

回到顶部

2、通过代码加载

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

Prism 源码解读3-Modules加载

在ModuleAModule中代码不变

这其中的逻辑在0节中已经解释清楚了,就不在叙述。

回到顶部

3、通过目录加载

通过目录加载,如果不看源码怎么设计,需要创建一个ModuleCatalog,在创建的时候将目录地址传入。在内部InnerLoad方法中找到对应目录,然后通过遍历程序集找到实现IModule接口的类,加载这个类就可以了。

看了下源码也正是这么做的

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

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

回到顶部

4、通过手动方式加载

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

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

Prism 源码解读3-Modules加载

Prism 源码解读3-Modules加载

值得注意的是并没有提供卸载Module的接口。

回到顶部

总结

这一篇介绍了下Modules加载的原理,其实就是

  • ModuleCatalog负责发现Module。
  • 通过ModuleManager来加载模块并对模块进行验证以确保模块的加载顺序,
  • ModuleInitializer负责模块的初始化,包括加载模块所必须的类和显示UI Elements等等。

下一篇开始将介绍MVVM的实现。

上一篇:GraphPad Prism 8 for Mac(绘图统计分析)线性回归中的r²的含义


下一篇:[Windows] Prism 8.0 入门(下):Prism.Wpf 和 Prism.Unity