04 模块 Prism For WPF

使用Prism的WPF库进行模块化应用程序开发

模块化应用程序——可以被分解成一组松散耦合的功能单元(模块),又可以集成到一个更大的应用程序中。客户端模块封装了应用程序全部功能的一部分,典型地表现了一组相关的关系。它可以包含一些相关联的组件,如应用特征;也可以包含用户界面和业务逻辑,或者一部分应用程序的基础结构,如应用级的日志或用户验证。模块之间相互独立但又可以通过一种松散耦合的方式相互通信。使用模块化应用设计模式会使得你的开发,测试,部署和维护更加轻松。

以个人银行业务为例,用户可以在一个界面使用诸多功能,如转账、付款、更新个人信息等。然而,在这些场景背后,每个功能都被封装在独立的模块之中。这些模块借助后端通信系统,如数据库服务或web服务,完成模块间的通信。应用服务集成不同模块的各种类组件并处理和用户之间的通信。终端用户看到就是像一个单独应用的综合视图。

下图就是一个模块化应用的设计示意图。

图1

模块化应用优势

你大概正在使用程序集、接口、类和良好的面向对象设计原则来完成一个应用。即使如此,除非非常小心,否则你的应用程序很可能还是会像“一块铁板”一样(所有的功能实现都和应用程序本身紧密耦合),这就会导致应用程序的开发,测试,扩展和维护异常艰难。

模块化应用方法可以帮助你识别程序中存在大量功能的区域,允许你独立地开发和测试这些功能。这可以是开发和测试更简单,除此之外,还可以让你的程序更加灵活,在未来更容易被扩展。正因为模块化应用方法可以让用户将原来的程序分解成容易管理的部分,所以程序的总体架构也就更加灵活,可维护性更强。每个部分都封装特定的功能,每个部分都通过明确且松散耦合的信道集成。

Prism为模块化应用开发提供的支持

Prism为模块化应用程序开发和运行时模块管理提供帮助。使用Prism可以节省你的时间,因为你不必去实现并测试自己的模块化框架。Prism框架提供如下特性:

  • 为注册模块和模块路径提供目录;你可以通过如下途径创建模块目录:
    • 在代码或XAML中定义模块
    • 在指定的目录中加载全部模块
    • 在配置文件中定义
    • 为模块声明元数据属性,以便可以支持初始化模式和依赖性
    • 与依赖注入容器集成以支持模块间的松散耦合
  • 模块载入
    • 依赖管理,包括复制和循环检测以保证模块加载顺序正确,保证只加载,初始化一次
    • 模块采用请求式和后台的方式下载,最小化程序启动时间;其余模块的加载和初始化可以在后台或需要的时间进行

核心概念

IModule:模块化程序构件

模块是功能和资源的逻辑集合,为实现独立的开发,测试,部署和集成,它以特定的形式打包。一个程序包可以是一个或多个程序集。每个模块都有一个中心的类,该类负责初始化模块,集成功能至应用。这个中心类实现IModule接口。

注意:实现IModule接口的类的存在已经足够将包识别为模块。
IModule接口有单一的名为Initialize的方法,在方法内部你可以实现任何你所需要的逻辑,并将模块的功能集成到程序之中。取决于模块用途的不同,该接口可以将视图注册到复合的用户界面,为程序创建额外的可用服务,或者扩展程序的功能。下面的代码展示了一个模块的最小化实现。

public class MyModule : IModule
{
    public void Initialize()
    {
        // Do something here.
    }
}

模块生命周期
在Prism中模块的装载过程包含以下步骤:

  • 注册/发现模块
    • 特定应用程序在运行时加载的模块在模块目录中定义。目录包含要装载的模块、模块位置、装载顺序等信息。
  • 装载模块
    • 包含模块的程序集被载入内存。这个过程可能需要从远程地址或者本地目录重新获得模块。
  • 初始化模块
    • 初始化模块意味着创建模块类的实例并通过IModule接口调用Initialize方法。

模块装载过程如下图所示。

这里写图片描述

模块目录

模块目录包含可以被程序调用的模块信息。该目录本质上是ModuleInfo类的集合。在ModuleInfo类中描述的模块包含名称、类型、位置以及模块的其他属性。以下是几种使用ModuleInfo实例填充模块目录的典型方法:

  • 在代码中注册模块
  • 在XAML文件中注册模块
  • 在配置文件中注册模块
  • 在本地目录注册模块

使用何种注册和发现机制取决于你程序的需要。使用配置文件或者XAML文件的方式可以让你不必引用模块;使用目录的方式可以让你不必指定模块文件。

控制何时加载模块

Prism程序可以以最快的速度实现模块——“有条件时”;或者当程序需要时实现模块——“请求式”。考虑以下关于加载模块的指导原则:

  • 当程序运行时,保证程序运行所必需的模块一定要随程序一起加载并初始化。
  • 当模块可用时,包含程序最经常使用的典型应用特征的模块可用在后台加载并初始化。
  • 包含很少使用特征的模块(或者可选择的提供帮助的模块)可以在需要的时候加载。

未完待续

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值