模块化开发是程序开发的一种方式,他将程序分为一组松散耦合的功能单元(命名模块),可集成到更大的应用程序中。模块封装了应用程序整体功能的一部分,通常代表一组相关功能。它可以包括一系列相关组件,如应用程序功能(包括用户界面和业务逻辑)或应用程序基础架构(如用于记录或验证用户的应用程序级服务)。模块是相互独立的,但可以松散地相互通信。使用模块化应用程序设计,您可以更轻松地开发、测试、部署和维护应用程序。
例如,考虑个人银行申请。用户可以访问各种功能,例如在帐户之间转账、支付账单和从单个用户界面 (UI) 更新个人信息。但是在后台,这些功能都封装在一个离散模块中。这些模块相互通信,并与后端系统(如数据库服务器和 Web 服务)进行通信。应用程序服务集成每个不同模块中的不同组件,并处理与用户的通信。用户看到一个类似于单个应用程序的集成视图。
您可能已经在使用组件、接口和类构建精心设计的应用程序,并采用良好的面向对象设计原则。即便如此,除非非常小心,否则您的应用设计可能仍然是"单一的"(在应用程序内,所有功能都以紧密耦合的方式实现),这会使应用程序难以开发、测试、扩展和维护。
另一方面,模块化应用方法可以帮助您识别应用程序的大型功能区域,并允许您独立开发和测试该功能。这可以使开发和测试更加容易,但也可以使您的应用程序更加灵活,并且更容易在未来扩展。模块化方法的好处是,它可以使您的整体应用架构更加灵活和可维护,因为它允许您将应用程序分解为可管理的部件。每一件都封装了特定的功能,并且每一件都通过清晰但松散耦合的通信通道进行集成。
Prism为模块化应用程序开发和应用程序内的运行时间模块管理提供支持。使用 Prism 的模块化开发功能可以节省您的时间,因为您不必实现和测试自己的模块化框架。Prism支持以下模块化应用程序开发功能:
对于模块加载:
依赖性管理,包括重复和循环检测,以确保模块按正确顺序加载,并且仅加载和初始化一次
按需和背景下载模块,以尽量减少应用程序启动时间;其余模块可以在后台或需要时加载和初始化
本节介绍了与Prism模块化相关的核心概念,包括接口、模块加载过程、模块目录、模块之间的通信和依赖性注入容器。
模块化到IModule接口
首先根据Prism(MVVM)中介绍的方法,引入Prism框架
然后创建图示三个项目,分别引入Prism框架,创建相应的文件夹
这种方法要实现模块化,ConfigureModuleCatalog配合Profile(IModule),在ModuleWpf项目中把依赖的两个模块ModuleA与ModuleB管理起来
在MouleWpf中的App.xaml.cs中重写ConfigureModuleCatalog方法
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule();
moduleCatalog.AddModule();
base.ConfigureModuleCatalog(moduleCatalog);
}
要调用PageA与PageB要将它们注册,只有注册过的界面才能被使用
注册的类要继承IModule接口,此类不写在ModuleWpf项目中
public class ModuleBProfile : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation();
}
}
最重要的是要将这两个项目在ModuleWpf中引用
ModuleWpf项目完全不依赖ModuleA与ModuleB,完全解耦
在MouleWpf中的App.xaml.cs中重写CreateModuleCatalog方法
给依赖模块设置一个查找路径
protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath=@".\Modules"};
}
注意将模块dll文件放进该路径下
通过配置文件要修改ModuleWpf下的App.config
先创建一个自定义节点,使用configSections标签(注意:每个配置文件只允许存在一个configSections标签,如果存在该元素标签,ta还必须是根元素(configuration)下的第一个子元素)
在MouleWpf中的App.xaml.cs中重写CreateModuleCatalog方法
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}
注意返回的值,与2.2不同
要实现功能要把dll放在debug目录下