上一篇说了客户端入口项目,这儿呢,就简单说下各模块是如何整合的,这个框架引入Prism的目的就是为了让WPF项目可以进行模块化应用程序开发,大型的系统客户端项目可以分而治之,由各个小组或者小团队配合一起开发,最终将所有模块集成起来就可以了,基本上彼此互不干扰;像HIS系统这种医疗行业的系统是由很多子系统组成,如门诊医生工作站,住院护士站,移动护理等等组成。
Prism各子系统如何整合
在这个WPF开发框架中应用了Prism将各子系统模块化,点击链接你可以了解更多的关于使用Prism库进行WPF的模块化应用程序开发的内容。
根据Prism模块化开发指南的文章,各个子系统要整合在一起的话,第1步:要在各自的类库里面定义一个中央类(central class,指模块初始化类),这个类实现 IModule 接口,第2步:然后再到入口程序处加载各子系统即可。
在加载子系统时,JHRS框架使用代码注册方式,即在系统启动时扫描整个程序集加载到内存里面,之后就可以被使用了。
接下入就通过代码来演示是如何让各个子系统整合在一起的。
创建WPF库(模块)并定义模块类
实际开发中,各个模块(或子系统)是单独创建一个项目类库来保存相关功能页面或窗体,在JHRS框架中的modules解决方案文件夹中,有三个WPF的库(JHRS.OutpatientSystem、JHRS.RegisterManagement、JHRS.SystemManage),分别表示3个子系统,创建新的模块后,第一件事情要做的就是编写一个中央类(central class,指模块初始化类)来实现 IModule 接口。
using Prism.Ioc; using Prism.Modularity; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JHRS.RegisterManagement { [Module(ModuleName = "RegisterManagementModule", OnDemand = true)] public class RegisterManagementModule : IModule { public void OnInitialized(IContainerProvider containerProvider) { } public void RegisterTypes(IContainerRegistry containerRegistry) { } } }
注册模块
Prism向入口程序注册模块的方式有3种,或者说加载子模块的方式有:
- 1、通过代码注册来加载
- 2、使用XAML加载
- 3、使用配置文件加载
如果手动通过代码注册的话,只需要一个一个模块注册即可,示例代码如下:
protected override void ConfigureModuleCatalog() { Type moduleCType = typeof(ModuleC); ModuleCatalog.AddModule(new ModuleInfo() { ModuleName = moduleCType.Name, ModuleType = moduleCType.AssemblyQualifiedName, }); }
而在实际项目中,可以通过反射的扫描目录程序集自动注册,这样就避免了随着子模块越来越多的情况下手动注册会编写大量的重复代码的问题,在框架中是这样注册的:
/// <summary> /// 注册系统模块 /// </summary> /// <param name="moduleCatalog"></param> protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { var modules = AppDomainAllAssemblyFinder.FindAll<IModule>(); foreach (var item in modules) { moduleCatalog.AddModule(new ModuleInfo { ModuleName = item.Name, ModuleType = item.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); } }
上面的AppDomainAllAssemblyFinder类的源码可以参见github上面。基本上完成了上面的步骤就可以把各子系统注册到入口程序里面去加载显示出来了,应用Prism来将WPF的各个子系统模块化是不是很简单呢?
写在最后
站在巨人的肩膀上,我们看得更远,但在这之前,最好了解一下这个巨人,不然遇到问题反而花费更多的时间来解决(踩坑);下一篇将介绍业务处理的功能了,这个框架是基于WPF的,开发也是遵循MVVM,因此所有的业务代码都是放在了ViewModel来处理。
如果你的ViewModel是一个光秃秃的类,这种设计方式并不是最佳的,因为业务做到后期会发现,咦,怎么那么多类似的代码了呢?这个时候出现类似问题就是在前期没有考虑怎样设计合理的ViewModel基类,那么相关的内容放到下一篇了。