码迷,mamicode.com
首页 > 其他好文 > 详细

《Prism 5.0源码走读》ModuleCatalog

时间:2014-08-24 19:17:02      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:blog   os   使用   io   strong   ar   div   log   new   

概念

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

标签:blog   os   使用   io   strong   ar   div   log   new   

原文地址:http://www.cnblogs.com/codesee/p/3933028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!