《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的提交与具体运行流程做详细 ...
随机推荐
- 传输层(一)TCP的三次握手和四次挥手及关闭套接字的原理
TCP连接需三次握手才能建立,断开连接则需要四次握手. 客户端TCP状态迁移: CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_W ...
- Android开发-API指南-数据存储
Storage Options 英文原文:http://developer.android.com/guide/topics/data/data-storage.html 采集日期:2015-02-0 ...
- [ Office 365 开发系列 ] 开发模式分析
前言 本文完全原创,转载请说明出处,希望对大家有用. 在正式开发Office 365应用前,我们先了解一下Office 365的开发模式,根据不同的应用场景,我们选择最适合的开发模式. 阅读目录 Of ...
- (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)
hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...
- No.008 String to Integer (atoi)
8. String to Integer (atoi) Total Accepted: 112863 Total Submissions: 825433 Difficulty: Easy Implem ...
- 华为OJ平台——首次不重复字符
题目描述: 输入一个字符串,输出字符串中第一个没有重复的字符,若没有满足条件的字符存在,则输出“.” 思路: 这题很简单,直接逐次比较就好了,但是没有考虑到更好效率的方法,以后想到的话再加上来 imp ...
- javascript设计模式-外观模式
也可译为门面模式.它为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.引入外观角色之后,使用者只需要直接与外观角色交互,使用者与子系统之 ...
- Iphone5S 体验(视频+截图)
Iphone5S眨眼从外观看和5区别不大,仔细一看后面,最大的变化还是闪光灯,内部使用了A7的处理器运算速度增强了不少.无论照相还是FaceTime摄像都非常清晰,就连常用的手电筒和动态天气预报都考虑 ...
- cordova local notification plugin
cordova plugin add org.apache.cordova.device cordova plugin add https://github.com/katzer/cordova-pl ...
- ASP.NET MVC学习1
ViewBag是一个dynamic(动态类型)类型集合,可以动态添加任何类型的任意名称的属性和值,ViewBag是Controller和view之间传递数据的,如以下: ViewBag.HtmlStr ...