概念

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的验证:
    1. 验证module是否重复;
    2. 验证modules没有循环引用;
    3. 验证不同的module group里的modules之间没有相互引用;
    4. 验证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的更多相关文章

  1. 《Prism 5.0源码走读》Prism 5.0简介

    Prism是一个开发和设计模块化WPF应用的基础框架,里面包含了MVVM pattern和设计示例.当前最新的版本是Prism 5.0,官方网站:https://compositewpf.codepl ...

  2. 《Prism 5.0源码走读》UnityBootstrapper

    UnityBootstrapper (abstract class)继承自Bootstrapper(abstract)类, 在Prism.UnityExtensions.Desktop project ...

  3. 《Prism 5.0源码走读》Bootstrapper

    Prism框架需要在应用程序启动的时候进行一些初始化的工作,Bootstrapper就是来做这些的,是其切入点. Bootstrapper主要要做的事有:创建和配置module catalog,创建D ...

  4. 《Prism 5.0源码走读》Service Locator Pattern

    在Prism Bootstrapper里面取实例的时候使用 ServiceLocator模式,使用的是CommonServiceLocator库 (http://commonservicelocato ...

  5. 《Prism 5.0源码走读》 设计模式

    Prism或Prism构建的应用程序时会使用大量的设计模式,本文简要列举Prism相关的那些设计模式. Adapter(适配器模式):Prism Library主要在Region和IoC contai ...

  6. Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使 ...

  7. Apache Spark源码走读之16 -- spark repl实现详解

    欢迎转载,转载请注明出处,徽沪一郎. 概要 之所以对spark shell的内部实现产生兴趣全部缘于好奇代码的编译加载过程,scala是需要编译才能执行的语言,但提供的scala repl可以实现代码 ...

  8. Apache Spark源码走读之13 -- hiveql on spark实现详解

    欢迎转载,转载请注明出处,徽沪一郎 概要 在新近发布的spark 1.0中新加了sql的模块,更为引人注意的是对hive中的hiveql也提供了良好的支持,作为一个源码分析控,了解一下spark是如何 ...

  9. Apache Spark源码走读之7 -- Standalone部署方式分析

    欢迎转载,转载请注明出处,徽沪一郎. 楔子 在Spark源码走读系列之2中曾经提到Spark能以Standalone的方式来运行cluster,但没有对Application的提交与具体运行流程做详细 ...

随机推荐

  1. HDU1232畅通工程

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1232 #include<stdio.h> #include<string.h> ...

  2. Drupal8开发教程:认识.info.yml文件

    YAML 文件是新引入的重要项目文件,在 Drupal 8 中,无论是模块.主题还是安装配置文件,都需要 .info.yml 文件来为其存储项目相关的基础信息. 在 Drupal 中,.info.ym ...

  3. AX调用.dll

    1,将DLL拷贝到C:\Program Files (x86)\Microsoft Dynamics AX\50\Client\Bin 2,在AOT添加引用,在选择你拷贝的DLL,确定.//Acces ...

  4. js正则表达式中匹配反引号

    直接用反引号就可以了~ /`[\W\w\*]+`\.`[\W\w\*]+`/

  5. javascript设计模式-适配器模式

    适配器模式的主要作用是将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些对象(类)可以一起工作. UML示意图: 例如,鸭子有fly方法和quack(嘎嘎 ...

  6. VS2010之MFC串口通信的编写教程

    http://wenku.baidu.com/link?url=K1XPdj9Dcf2of_BsbIdbPeeZ452uJqiF-s773uQyMzV2cSaPRIq6RddQQH1zr1opqVBM ...

  7. leetcode 83

    83. Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such that e ...

  8. leetcode 13

    罗马数字是阿拉伯数字传入之前使用的一种数码.罗马数字采用七个罗马字母作数字.即Ⅰ(1).X(10).C(100).M(1000).V(5).L(50).D(500). 记数的方法: 相同的数字连写,所 ...

  9. Linux日志

    一.Linux 常見的日志文件 /var/log/cron:你的 crontab 排程有没有实际被进行? 进行过程有没有发生错误?你的 /etc/crontab 是否撰写正确?在这个登录档内查询看看. ...

  10. ADO.NET数据库

    ASP.NET提供了ADO.NET技术,它是ASP.NET应用程序与数据库进行交互的一种技术. ADO.NET技术把对数据库的操作分为几个步骤,并为每个步骤提供对象来封装操作过程,从而使对数据库的操作 ...