《Prism 5.0源码走读》ModuleCatalog
概念
ModuleCatalog 是Prism中主要概念之一,主要用来保存应用程序可用的modules(模块),每个module都是用ModuleInfo来定义(包含module的名称、类型和位置)。
功能实现
ModuleCatalog继承自IModuleCatalog,IModuleCatalog声明了以下属性和方法:
- ModuleCatalog保存的所有modules
IEnumerable<ModuleInfo> Modules { get; } - 获取某一module依赖的modules
IEnumerable<ModuleInfo> GetDependentModules(ModuleInfo moduleInfo);
- 获取包含参数modules及其依赖的所有modules
IEnumerable<ModuleInfo> CompleteListWithDependencies(IEnumerable<ModuleInfo> modules);
- 初始化ModuleCatalog,可在这个方法加载modules和验证modules
void Initialize();
- 添加一个module到ModuleCatalog
void AddModule(ModuleInfo moduleInfo);
ModuleCatalog除了实现IModuleCatalog声明的属性和方法外,还提供了许多其他属性和方法:
- 定义了grouped modules和非grouped modules
public IEnumerable<ModuleInfoGroup> Groups
{
get
{
return this.Items.OfType<ModuleInfoGroup>();
}
} protected IEnumerable<ModuleInfo> GrouplessModules
{
get
{
return this.Items.OfType<ModuleInfo>();
}
} - Modules: 获取所有的modules,包含grouped和非grouped
public virtual IEnumerable<ModuleInfo> Modules
{
get
{
return this.GrouplessModules.Union(this.Groups.SelectMany(g => g));
}
} - 提供两个从XAML创建ModuleCatalog的static方法
public static ModuleCatalog CreateFromXaml(Stream xamlStream) public static ModuleCatalog CreateFromXaml(Uri builderResourceUri)
- 对modules的验证:
- 验证module是否重复;
- 验证modules没有循环引用;
- 验证不同的module group里的modules之间没有相互引用;
- 验证InitializationMode是WhenAvailable的module不能依赖于mode是OnDemand的module;(原因是加载的时机不能冲突)
public virtual void Validate()
{
this.ValidateUniqueModules();
this.ValidateDependencyGraph();
this.ValidateCrossGroupDependencies();
this.ValidateDependenciesInitializationMode(); this.Validated = true;
}
- 重载了好几个AddModule方法
- 提供添加Module Group方法
public virtual ModuleCatalog AddGroup(InitializationMode initializationMode, string refValue, params ModuleInfo[] moduleInfos)
ModuleCatalog也可以作为基类来自定义catalog。
应用
在Bootstrapper中有两个Module Catalog相关的方法:创建和配置。
protected virtual IModuleCatalog CreateModuleCatalog()
{
return new ModuleCatalog();
} protected virtual void ConfigureModuleCatalog()
{
}
在使用Prism构建WPF应用程序的时候,我们一般会自定义一个bootstrapper继承自prism的UnityBootstrapper或MefBootstrapper (当然亦可以使用其他IoC container的extension bootstrapper)。
在定义的bootstrapper里面需要重写ConfigureModuleCatalog方法,把具体的module加入到module catalog里面。
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog(); ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
moduleCatalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
}
总结
ModuleCatalog的总体实现还是比较简单的,很容易看懂。但里面有一个很重要的算法本文暂为提及,会单独写一篇随笔来介绍。
这个算法就是如何验证modules之间的循环引用。
《Prism 5.0源码走读》ModuleCatalog的更多相关文章
- 《Prism 5.0源码走读》Prism 5.0简介
Prism是一个开发和设计模块化WPF应用的基础框架,里面包含了MVVM pattern和设计示例.当前最新的版本是Prism 5.0,官方网站:https://compositewpf.codepl ...
- 《Prism 5.0源码走读》UnityBootstrapper
UnityBootstrapper (abstract class)继承自Bootstrapper(abstract)类, 在Prism.UnityExtensions.Desktop project ...
- 《Prism 5.0源码走读》Bootstrapper
Prism框架需要在应用程序启动的时候进行一些初始化的工作,Bootstrapper就是来做这些的,是其切入点. Bootstrapper主要要做的事有:创建和配置module catalog,创建D ...
- 《Prism 5.0源码走读》Service Locator Pattern
在Prism Bootstrapper里面取实例的时候使用 ServiceLocator模式,使用的是CommonServiceLocator库 (http://commonservicelocato ...
- 《Prism 5.0源码走读》 设计模式
Prism或Prism构建的应用程序时会使用大量的设计模式,本文简要列举Prism相关的那些设计模式. Adapter(适配器模式):Prism Library主要在Region和IoC contai ...
- Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现
欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使 ...
- Apache Spark源码走读之16 -- spark repl实现详解
欢迎转载,转载请注明出处,徽沪一郎. 概要 之所以对spark shell的内部实现产生兴趣全部缘于好奇代码的编译加载过程,scala是需要编译才能执行的语言,但提供的scala repl可以实现代码 ...
- Apache Spark源码走读之13 -- hiveql on spark实现详解
欢迎转载,转载请注明出处,徽沪一郎 概要 在新近发布的spark 1.0中新加了sql的模块,更为引人注意的是对hive中的hiveql也提供了良好的支持,作为一个源码分析控,了解一下spark是如何 ...
- Apache Spark源码走读之7 -- Standalone部署方式分析
欢迎转载,转载请注明出处,徽沪一郎. 楔子 在Spark源码走读系列之2中曾经提到Spark能以Standalone的方式来运行cluster,但没有对Application的提交与具体运行流程做详细 ...
随机推荐
- MFC学习 标签页与属性页及各常用控件使用
参考 http://blog.csdn.net/anye3000/article/details/6700023 CTabCtrl: BOOL CTabTestDlg::OnInitDialog() ...
- 【Unity Shaders】学习笔记——SurfaceShader(七)法线贴图
[Unity Shaders]学习笔记——SurfaceShader(七)法线贴图 转载请注明出处:http://www.cnblogs.com/-867259206/p/5627565.html 写 ...
- 哪项技术可以用在WEB开发中实现会话跟踪实现?
HTTP是“无状态”协议:客户程序每次读取 Web 页面,都打开到 Web 服务器的单独的连接,并且,服务器也不自动维护客户的上下文信息.即使那些支持持续性 HTTP 连接的服务器,尽管多个客户请求连 ...
- OpenGL ES学习笔记(一)——基本用法、绘制流程与着色器编译
首先声明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. 在Android.iOS等移动平台上 ...
- Centos安装arm-linux-gcc等交叉工具链
1.安装(仅以其中一个为例) 1.1 下载arm-linux-gcc (搜一下,很多的!) 1.2 解压:指定解压到根目录 tar xvzf arm-linux-gcc-4.4.3.tar.gz -C ...
- 洛谷P2731 骑马修栅栏 Riding the Fences
P2731 骑马修栅栏 Riding the Fences• o 119通过o 468提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论 • 数据有问题题 ...
- ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻
一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问 ...
- ubuntu多网卡绑定
这是最近碰到这个问题,需要将两张网卡绑定,共用一个IP,实现冗余效果.实际上linux双网卡的绑定模式有7中,而在这里常用的是 active-backup linux有七种网卡绑定模式:0. roun ...
- iptable nat网关
echo "1" > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s 192.168.1.0/ ...
- TCP/IP之大明王朝邮差
一位大神的精华之作,原创2016-05-12 刘欣 来自码农翻身! 时间: 大明王朝天启四年, 清晨. 天色刚蒙蒙亮,我就赶着装满货物的马车来到了南城门,这里是集中处理货物的地方,一队一队的马车都来到 ...