标签:blog os 使用 io strong ar div log new
概念
ModuleCatalog 是Prism中主要概念之一,主要用来保存应用程序可用的modules(模块),每个module都是用ModuleInfo来定义(包含module的名称、类型和位置)。
功能实现
ModuleCatalog继承自IModuleCatalog,IModuleCatalog声明了以下属性和方法:
IEnumerable<ModuleInfo> Modules { get; }
IEnumerable<ModuleInfo> GetDependentModules(ModuleInfo moduleInfo);
IEnumerable<ModuleInfo> CompleteListWithDependencies(IEnumerable<ModuleInfo> modules);
void Initialize();
void AddModule(ModuleInfo moduleInfo);
ModuleCatalog除了实现IModuleCatalog声明的属性和方法外,还提供了许多其他属性和方法:
        public IEnumerable<ModuleInfoGroup> Groups
        {
            get
            {
                return this.Items.OfType<ModuleInfoGroup>();
            }
        }
        protected IEnumerable<ModuleInfo> GrouplessModules
        {
            get
            {
                return this.Items.OfType<ModuleInfo>();
            }
        }
        public virtual IEnumerable<ModuleInfo> Modules
        {
            get
            {
                return this.GrouplessModules.Union(this.Groups.SelectMany(g => g));
            }
        }
public static ModuleCatalog CreateFromXaml(Stream xamlStream) public static ModuleCatalog CreateFromXaml(Uri builderResourceUri)
        public virtual void Validate()
        {
            this.ValidateUniqueModules();
            this.ValidateDependencyGraph();
            this.ValidateCrossGroupDependencies();
            this.ValidateDependenciesInitializationMode();
            this.Validated = true;
        }
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之间的循环引用。
标签:blog os 使用 io strong ar div log new
原文地址:http://www.cnblogs.com/codesee/p/3933028.html