快速业务通道

Prism V2之旅(5)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19

这篇来介绍Prism中的很重要的一个功能模块化.

基本概念

模块化的概念类似于现在网上比较流行的Widget,如下例子

google的个性化页面

Prism V2之旅(5)

vista的sidebar

Prism V2之旅(5)

他们都有如下特性:

1.模块之间没有关联,模块之间不会相互引用

2.可插拔(可随意增删改模块)

使用prism框架,模块是基础,一个系统是由多个模块组成,一个模块可以代表一个子功能,很重要的是这样的做法可以降低开发的复杂度.下面我们来了解在prism中,模块的基本使用方法.

1.注册模块

prism定义了一个IModule接口,Initialize方法是模块初始化的入口点,好比主程序的Main的入口点.

Prism V2之旅(5)

一般情况下,每新建一个模块都会新建一个项目来完成(当然这不是必须的规定).下面是一个简单的例子

public class ModuleA : IModule
{
  private readonly IRegionManager regionManager;
  public ModuleA(IRegionManager regionManager)
  {
    this.regionManager = regionManager;
  }
  public void Initialize()
  {
    this.regionManager.Regions["MainRegion"].Add(new DefaultViewA());
  }
}

在模块初始化的时候,可以在依赖注入容器中获取已注册的服务

加载模块的方式有三种

静态加载模块

根据目录加载模块

根据配置文件加载模块

Prism V2之旅(5)

加载模块现在有以下概念:

模块添加方法

模块依赖性

模块加载方式

2.加载模块之静态加载模块

2.1重写Bootstrapper的GetModuleCatalog方法

在Bootstrapper引导程序中重写GetModuleCatalog方法,返回一个实现IModuleCatalog的对象,静态加载模块请返回ModuleCatalog类

protected override IModuleCatalog GetModuleCatalog()
{
  ModuleCatalog catalog = new ModuleCatalog();
  catalog.AddModule(typeof (ModuleA), "ModuleD")
    .AddModule(typeof (ModuleB))
    .AddModule(typeof (ModuleD), "ModuleB")
    .AddModule(typeof (ModuleC), InitializationMode.OnDemand)
    ;
    
  return catalog;
}

2.2模块依赖(dependsOn)

AddModule方法,第一个参数是模块类型,第二个是该模块依赖的模块.如上ModuleA依赖于ModuleD,ModuleD依赖于ModuleB.所以上面的加载顺序如下.模块依赖在不同加载模块的方式都有,只不过做法不同而已

Prism V2之旅(5)

2.3加载方式(初始化加载和按需加载)

(1)初始化加载

InitializationMode决定模块是否初始化时加载,默认是WhenAvailable,OnDemand则会在请求时加载

public enum InitializationMode
{
  /// <summary>
  /// The module will be initialized when it is available on application start-up.
  /// </summary>
  WhenAvailable,
  /// <summary>
  /// The module will be initialized when requested, and not automatically on application start-up.
  /// </summary>
  OnDemand
}

以上配置,将会初始化ModuleA,B,C三个模块,ModuleC则不初始化.

(2)按需加载

按需加载可以减少初始化时加载模块的时间.可以在需要时使用IModuleManager接口的LoadModule方法来加载所需模块

(注意:这里虽是延迟加载,但这个模块已经进来,就是说这个模块的dll还是被加载了,只不过没初始化而已)

public DefaultViewB(IModuleManager moduleManager)
  : this()
{
  this.moduleManager = moduleManager;
}
private void OnLoadModuleCClick(object sender, RoutedEventArgs e)
{
  // This logic is placed in code-behind instead of a presenter
  // for the ease of demonstrating module loading.
  this.moduleManager.LoadModule("ModuleC");
}

3.加载模块之根据目录加载模块

三个步骤

3.1

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号