zoukankan      html  css  js  c++  java
  • 《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的验证:
      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之间的循环引用。

  • 相关阅读:
    POJ-3254 + POJ-1185 状压DP入门题
    POJ-3667 线段树区间合并入门题
    HDU-4507 数位DP 记录一个毒瘤错误orz
    HDU-4734 F(x)数位dp
    HDU-3709 Balanced Number 数位dp+枚举
    分块入门 LibreOJ分块九题
    HDU-4389 X mod f(x) && 2018上海大都会邀请赛J 数位dp
    HDU-3038 How Many Answers Are Wrong (带权并查集)
    Codeforces 608B Hamming Distance Sum (前缀和)
    (二十六 )数据库:水平切分,数据库秒级扩容!
  • 原文地址:https://www.cnblogs.com/codesee/p/3933028.html
Copyright © 2011-2022 走看看