CN115237386B - 用于大型复杂Windows原生桌面开发的方法及系统 - Google Patents
用于大型复杂Windows原生桌面开发的方法及系统 Download PDFInfo
- Publication number
- CN115237386B CN115237386B CN202211134033.6A CN202211134033A CN115237386B CN 115237386 B CN115237386 B CN 115237386B CN 202211134033 A CN202211134033 A CN 202211134033A CN 115237386 B CN115237386 B CN 115237386B
- Authority
- CN
- China
- Prior art keywords
- module
- old
- new
- version
- service module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
Abstract
本发明属于软件开发技术领域,具体涉及用于大型复杂Windows原生桌面开发的方法及系统。方法包括:S1,创建开发项目,引入底层基础库和功能库;S2,注册模块管理容器;S3,将业务模块进行拆分和抽象,对每个业务模块形成抽象层,并通过动态模块组装方式,完成业务模块的选择和加载;S4,对开发项目中的任务进行分配,并通过热插拔方式对外提供接口;S5,配置业务模块信息,将设备型号与业务模块的对应关系进行存储;S6,通过当前设备型号,检索业务模块文件清单,并进行业务模块文件下载,下载后读取业务模块文件并加载到程序内,最终使程序开始运行。本发明具有灵活性强,能实现一站式面向所有windows桌面开发环节的特点。
Description
技术领域
本发明属于软件开发技术领域,具体涉及用于大型复杂Windows原生桌面开发的方法及系统。
背景技术
在目前的软件开发领域,大部分的软件产品都是以B/S(浏览器/服务端)的形式提供,这些网页形式的软件产品整占据着当今软件开发领域的绝对主流地位。但早些年前,在浏览器技术尚未成熟之时,大部分软件产品都是以C/S(客户端/服务端)的形式提供。C/S这种开发方式从Windows操作系统诞生之初就一直存在。发展至今,基于C/S的软件开发技术也是种类繁多,其中大部分都是原生技术(直接访问操作系统的Windows桌面开发技术),不过近些年一些非原生技术(使用内嵌浏览器的桌面软件开发技术)也开始流行起来,甚至凭借其开发效率,移植性好等优势大有一统C/S软件开发领域之势。
但是,无论是B/S架构的网页产品还是非原生技术开发的Windows桌面软件在性能和GUI(图形用户接口)表现力上面,都无法和原生的Windows桌面软件相比。所以时至今日,原生的Windows桌面软件开产品仍然活跃于一些特定领域:工业控制、金融、医疗设备、软件开发工具、图形设计工具(比如:Photoshop)、RPA(机器人流程自动化)等。这些领域的产品相同特征是:业务稳定但体量较大,用户交互复杂但共性较多,对运行效率要求高,和操作系统、硬件设备的交互较多。而企业面对这些软件产品的开发需要投入大量时间、人力成本,而且一旦产品开发成型,面对后续的需求变更,场景切换时,会给开发人带来抽丝剥茧类的工作,大大增加了软件的维护成本。
目前在原生桌面开发领域有许多框架产品。这些框架产品的特点是专注于窗口、控件、UI效果、解决复杂的用户交互。面对如今原生桌面技术应用场景逐渐集中这一情况,并没有做出更深入的挖掘和演变。最重要的是,这种解决局部开发环节、场景的框架并不能达到降本增效的目的,反而会因为多种类别的框架混合使用导致软件结构复杂,可维护性更差。所以真正对原生桌面软件开发有实际意义的是一款能一站式解决所有场景的开发框架。
目前的开发框架主要存在以下缺点:
1.目前的开发框架只解决了有限的开发场景
比如有些开发框架解决了窗口绘制和渲染,有些开发框封装了很多用户控件,有些开发框架实现了MVVM模式和解耦。开发实践中,开发人员就需要旁征博引,最终交付的软件产品是一个缝合了多方框架的结合体。这样一来软件结构的复杂性增加,不同框架间的衔接和适配又需要开发成本,尤其在面对后来的产品迭代,需求变更,版本兼容等场景时,格外乏力。
2.目前的开发框架忽略了目前原生桌面软件产品的共性
当前使用原生技术的桌面软件开发场景越发集中,企业都是在特定需求背景下才会考虑使用原生技术开发桌面软件。而对于这些场景的挖掘和抽象,目前鲜有开发框架去关注。框架本身就是要去为某一相同特征的软件开发场景提供通用的技术支撑。如今面对原生桌面软件开发的共性,正是一个优秀的软件框架所应该珍惜的契机。首先,如今需要原生技术开发的软件一定是大型且复杂的,大型复杂就对解耦和模块化有着相当高的要求。其次大型桌面软件在UI布局上有着高度的相似。比如菜单栏、工具栏、状态栏这三个UI部分基本在每一款大型桌面软件上都可以看到(例如office系列产品、Adobe系列产品)。
3.目前的开发框架在解耦和开放性上面还具备相当大的提升空间
跳出桌面软件开发领域,放眼整个软件开发领域,代码解耦一直是一个讨论热度极高的问题。多少年来一些优秀流行的框架 其核心无非是解决了代码的高耦合,比如大名鼎鼎的Spring。还有一些老生常谈的面向对象的设计模式都是围绕解耦来的。如今微服务架构在后端开发中流行起来,其效果也是得到了主流的认同。但是微服务思想在桌面软件开发中还是很难实践,因为服务本身是一个无窗口的后台程序,微服务之间强调的是独立。而桌面软件强调的高度协同。如果一个桌面软件拆分成多个进程,通过进程间通信的方式完成软件的运行,那其实大大增加了桌面软件的复杂度,降低了可维护性。所以要尽可能保持一个进程的前提下提升桌面软件的解耦度和开放性。
因此,设计一种灵活性强,能实现一站式面向所有windows桌面开发环节的用于大型复杂Windows原生桌面开发的方法及系统,就显得十分重要。
例如,申请号为CN202110474257.0的中国专利文献描述的一种Windows桌面程序开发框架、方法及相关组件,包括:前台平台库、后台基础包和脚手架,前台平台库用于储存应用前台开发过程中所需程序集的集合,基于表征引用程序集的指令提供与不同业务需求对应的目标程序集;目标程序集用于生成业务插件;后台基础包用于利用微服务架构生成应用后台开发过程中与不同业务需求对应的应用程序编程接口;脚手架用于为应用前台开发过程及应用后台开发过程提供解决方案源代码。虽然通过储存应用前台开发过程中所需程序集的前台平台库、利用微服务架构生成应用后台开发过程中的应用程序编程接口的后台基础包及提供解决方案源代码的脚手架之间的交互,实现基于微服务架构的前后台分离的桌面程序开发,但是其缺点在于,上述Windows桌面程序开发框架仍然是传统的割裂式,并不能一站式解决所有场景的开发问题。
发明内容
本发明是为了克服现有技术中,现有的Windows桌面开发框架存在只解决了有限的开发场景、忽略了目前原生桌面软件产品的共性以及解耦度和开放性较差的问题,提供了一种灵活性强,能实现一站式面向所有windows桌面开发环节的用于大型复杂Windows原生桌面开发的方法及系统。
为了达到上述发明目的,本发明采用以下技术方案:
用于大型复杂Windows原生桌面开发的方法,包括如下步骤:
S1,创建开发项目,引入底层基础库和功能库;
S2,注册模块管理容器;
S3,将业务模块进行拆分和抽象,对每个业务模块形成抽象层,并通过动态模块组装方式,完成业务模块的选择和加载;
S4,对开发项目中的任务进行分配,并通过热插拔方式对外提供接口;
S5,配置业务模块信息,将设备型号与业务模块的对应关系进行存储;
S6,通过当前设备型号,检索业务模块文件清单,并进行业务模块文件下载,下载后读取业务模块文件并加载到程序内,最终使程序开始运行。
作为优选,步骤S3包括如下步骤:
S31,每个业务模块均包括新版模块和旧版模块;将每个业务模块的新旧两种场景的业务接口进行抽象,得到抽象层;
S32,新版模块和旧版模块分别具有新代码和旧代码,通过新代码和旧代码分别将新版模块和旧版模块与抽象层连接;
S33,将新旧两套代码进行单独打包,形成一新一旧两个程序集文件,并存储到指定位置数据库或者本地文件夹,获得新旧两个版本软件;
S34,旧版软件通过旧版关键字获取到旧版模块对应的程序集文件相关信息,同时将旧版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为旧版模块的实例;
S35,新版软件通过新版关键字获取到新版模块对应的程序集文件相关信息,同时将新版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为新版模块的实例。
作为优选,步骤S4包括如下步骤:
S41,指定需要更新的业务模块,并卸载所述业务模块所在的应用程序域;
S42,下载所述业务模块中新版的程序集文件生成新版业务模块,并创建新的应用程序域承载新版业务模块;
S43,将新版业务模块扩展至模块管理容器,并加载新版业务模块。
作为优选,步骤S4中,对于托管模块使用应用程序域进行调用,对于非托管模块使用COM接口调用;所述托管模块为运行于CLR公共语言运行时环境的模块。
作为优选,步骤S41中,设定卸载的应用程序域为旧版应用程序域;所述旧版应用程序域中承载旧版业务模块;所述旧版业务模块对应的旧版程序集文件解除占用并删除。
作为优选,步骤S35中所述程序集文件相关信息包括程序集文件的名称和类别。
本发明还提供了用于大型复杂Windows原生桌面开发的系统包括:
框架引入模块,用于创建开发项目,引入底层基础库和功能库;
模块管理容器注册模块,用于注册模块管理容器;
动态模块组装模块,用于将业务模块进行拆分和抽象,对每个业务模块形成抽象层,并通过动态模块组装方式,完成业务模块的选择和加载;
热插拔模块,对开发项目中的任务进行分配,并通过热插拔方式对外提供接口;
信息配置模块,用于配置业务模块信息,将设备型号与业务模块的对应关系进行存储;
文件下载和运行模块,用于通过当前设备型号,检索业务模块文件清单,并进行业务模块文件下载,下载后读取业务模块文件并加载到程序内,最终使程序开始运行。
作为优选,所述动态模块组装模块具体如下:
每个业务模块均包括新版模块和旧版模块;将每个业务模块的新旧两种场景的业务接口进行抽象,得到抽象层;
新版模块和旧版模块分别具有新代码和旧代码,通过新代码和旧代码分别将新版模块和旧版模块与抽象层连接;
将新旧两套代码进行单独打包,形成一新一旧两个程序集文件,并存储到指定位置数据库或者本地文件夹,获得新旧两个版本软件;
旧版软件通过旧版关键字获取到旧版模块对应的程序集文件相关信息,同时将旧版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为旧版模块的实例;
新版软件通过新版关键字获取到新版模块对应的程序集文件相关信息,同时将新版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为新版模块的实例。
作为优选,所述热插拔模块具体如下:
指定需要更新的业务模块,并卸载所述业务模块所在的应用程序域;
下载所述业务模块中新版的程序集文件生成新版业务模块,并创建新的应用程序域承载新版业务模块;
将新版业务模块扩展至模块管理容器,并加载新版业务模块。
本发明与现有技术相比,有益效果是:(1)本发明基于现有桌面软件产品的业务场景的集中和专注这一情况进行深层次的挖掘和提取,最终抽象并总结出一套具有普适性的软件结构;(2)本发明使用了一系列创新的技术保证了开发框架的绝对开放性和普适性,包括动态模块组装技术,该技术使用了后台组装,前台加载的形式,彻底解决了全量软件包造成的体积大和安全性差、逻辑判断多而杂、解耦不彻底的问题,该技术的引入最大程度地解决了一站式和开放式两个难以平衡的难题,一站式为的是提供给开发者一个全量解决方案的开发框架,开放式是为了适配各种复杂的业务场景,无上限地支持开发人员的二次开发;(3)本发明针对托管模块和非托管模块提供了不同的热插拔支持;有了动态模块组装和模块热插拔这两项创新技术的加持,让开发框架具备了一站式和开放式的技术基础,再结合业务场景的挖掘和抽象,形成了一款高复用性,高解耦度,高开放性的开发框架;(4)本发明突破了传统桌面开发框架的上限,将传统桌面软件开发的各个部分和环节打通,达到提升开发效率,提升软件产品的可维护性和可扩展性上限,让软件产品在迭代过程中遇到复杂的场景切换,需求变更能做出更快的响应和健壮性的保持,具有降低开发成本,提升用户体验,提高产品竞争力的特点。
附图说明
图1为本发明中底层基础库的一种框架示意图;
图2为本发明中功能库的一种框架示意图;
图3为本发明中动态模块组装方式的一种过程示意图;
图4为本发明中热插拔方式的一种过程示意图;
图5为本发明中设备型号与模块关系的一种配置清单示意图;
图6为本发明中设备型号与模块关系的另一种配置清单示意图;
图7为本发明实施例所提供的用于大型复杂Windows原生桌面开发的方法的一种流程图;
图8为本发明实施例所提供的软件配置与程序运行的一种流程图。
具体实施方式
为了更清楚地说明本发明实施例,下面将对照附图说明本发明的具体实施方式。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图,并获得其他的实施方式。
实施例:
如图7所示,本发明提供了用于大型复杂Windows原生桌面开发的方法,包括如下步骤:
S1,创建开发项目,引入底层基础库和功能库;
S2,注册模块管理容器;
S3,将业务模块进行拆分和抽象,对每个业务模块形成抽象层,并通过动态模块组装方式,完成业务模块的选择和加载;
S4,对开发项目中的任务进行分配,并通过热插拔方式对外提供接口;
S5,配置业务模块信息,将设备型号与业务模块的对应关系进行存储;
S6,通过当前设备型号,检索业务模块文件清单,并进行业务模块文件下载,下载后读取业务模块文件并加载到程序内,最终使程序开始运行。
其中,底层基础库的框架结构如图1所示。底层基础库专注于软件开发的基础设施,该框架不仅为了达到一站式这一目标,将所有桌面软件开发涉及到的内容全部进行封装提供,同时也支持扩展。功能库的框架结构如图2所示。图7中,权限管理模块用于区分普通用户和专业用户。
步骤S2中注册的模块管理容器指的是IOC容器(Inversion of ControlContainer,控制反转容器,这是一项业内普遍认可的解耦代码的技术方案)。注册模块管理容器的意义是:将模块类型注册到IOC容器中,模块的创建、生命周期、模块间的引用完全由IOC容器管理。这样可以达到高内聚、低耦合的目的。
进一步的,步骤S3包括如下步骤:
S31,每个业务模块均包括新版模块和旧版模块;将每个业务模块的新旧两种场景的业务接口进行抽象,得到抽象层;
S32,新版模块和旧版模块分别具有新代码和旧代码,通过新代码和旧代码分别将新版模块和旧版模块与抽象层连接;
S33,将新旧两套代码进行单独打包,形成一新一旧两个程序集文件,并存储到指定位置数据库或者本地文件夹,获得新旧两个版本软件;
S34,旧版软件通过旧版关键字获取到旧版模块对应的程序集文件相关信息,同时将旧版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为旧版模块的实例;
S35,新版软件通过新版关键字获取到新版模块对应的程序集文件相关信息,同时将新版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为新版模块的实例。
上述步骤过程描述了动态模块组装的过程。动态模块组装就是要让程序自发的选择依赖项去加载,只加载有效项,避免全量加载。通过选择不同的加载项实现适配不同场景等需求。核心思想是以程序集为单位对模块进程拆分,再将模块与程序集的对应关系进行存储。如图3所示,展示了对于一个应用程序的模块配置环节。该监控模块需要支持新旧两种场景,需要两套代码,首先将两种场景的业务接口进行抽象,得到监控模块抽象层。新旧两套代码各自实现此抽象层。接下来,把两套代码进行单独打包,形成一新一旧两个程序集文件。接着把这两个程序集文件存储到指定位置数据库或者本地文件夹。而主程序的代码只保留抽象层的引用,并不需要创建新或者旧版模块的实例。待到程序构建打包后,会有新旧两个版本的软件。其中旧版软件通过自身的旧版关键字可以获取到旧版模块对应的程序集相关信息,包括程序集文件名称,包名,类名等等。获取到这些信息后,将程序集文件加载到程序中,通过反射创建模块抽象层的实例。此实例即为旧版模块的实例。新版模块亦然。这样完成了0逻辑选择模块和加载模块。
动态模块组装技术不仅在开发阶段降低了代码的耦合度,而且在程序运行阶段降低了程序执行的复杂度。更关键的让软件包的文件实现了最大限度了瘦身,进而让软件的资源开销降到了最低。这种动态组装的方式还增加了灵活性,如果把模块的抽象做到了极致,那面对需求变更,多场景适配等问题,甚至不需要重新开发和打包,而是直接通过文件配置就能组装出一款全新的产品。
进一步的,步骤S4包括如下步骤:
S41,指定需要更新的业务模块,并卸载所述业务模块所在的应用程序域;
S42,下载所述业务模块中新版的程序集文件生成新版业务模块,并创建新的应用程序域承载新版业务模块;
S43,将新版业务模块扩展至模块管理容器,并加载新版业务模块。
步骤S4中,对于托管模块使用应用程序域进行调用,对于非托管模块使用COM接口调用;所述托管模块为运行于CLR公共语言运行时环境的模块。
步骤S41中,设定卸载的应用程序域为旧版应用程序域;所述旧版应用程序域中承载旧版业务模块;所述旧版业务模块对应的旧版程序集文件解除占用并删除。
如图4所示,上述步骤过程描述了模块热插拔的过程。模块热插拔在桌面软件开发中一直占据重要地位。很多大型桌面软件都有扩展插件这一功能,对于扩展插件的更新和卸载就显得必不可少了。而对于所有大型桌面软件而言,如果每个功能模块都能实现热插拔,那对于程序的灵活性和健壮性都是极大的提升。最简单粗暴的热插拔技术就是多进程。把每个模块做成独立进程,然后通过进程间通信完成协同。对于热插拔的需求,直接杀死进程或者启动进程即可。而一个主程序下会有很多个独立进程,对于如此多的进程管理代码的繁琐可能已经抵消了热插拔带来的便利。进程的隔离导致很多依赖项需要多份拷贝,很多类和对象需要多份生命,这无疑增大了整体的开销。所以还是要追求在同一进程内完成模块热插拔。在Windows的官方文档中有着这样的说明:程序集一旦加载到内存中,就无法卸载。所以本发明引入了应用程序域这项技术。应用程序域相当于在进程内进行了二次边界分割,每个应用程序域都是隔离的,可以单独进行创建,加载和卸载。这样一来就可以通过创建应用程序域来进行模块的加载。再通过卸载应用程序域完成模块的卸载。
但是应用程序域仅对托管(运行于CLR 公共语言运行时环境)的模块有效,对于非托管模块,使用COM技术。COM使用直接的二进制接口的方式实现进程间通信,并且支持卸载操作。这样一来,本发明的模块热插拔技术就覆盖了托管模块和非托管模块。
本发明还提供了用于大型复杂Windows原生桌面开发的系统包括:
框架引入模块,用于创建开发项目,引入底层基础库和功能库;
模块管理容器注册模块,用于注册模块管理容器;
动态模块组装模块,用于将业务模块进行拆分和抽象,对每个业务模块形成抽象层,并通过动态模块组装方式,完成业务模块的选择和加载;
热插拔模块,对开发项目中的任务进行分配,并通过热插拔方式对外提供接口;
信息配置模块,用于配置业务模块信息,将设备型号与业务模块的对应关系进行存储;
文件下载和运行模块,用于通过当前设备型号,检索业务模块文件清单,并进行业务模块文件下载,下载后读取业务模块文件并加载到程序内,最终使程序开始运行。
所述动态模块组装模块具体如下:
每个业务模块均包括新版模块和旧版模块;将每个业务模块的新旧两种场景的业务接口进行抽象,得到抽象层;
新版模块和旧版模块分别具有新代码和旧代码,通过新代码和旧代码分别将新版模块和旧版模块与抽象层连接;
将新旧两套代码进行单独打包,形成一新一旧两个程序集文件,并存储到指定位置数据库或者本地文件夹,获得新旧两个版本软件;
旧版软件通过旧版关键字获取到旧版模块对应的程序集文件相关信息,同时将旧版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为旧版模块的实例;
新版软件通过新版关键字获取到新版模块对应的程序集文件相关信息,同时将新版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为新版模块的实例。
所述热插拔模块具体如下:
指定需要更新的业务模块,并卸载所述业务模块所在的应用程序域;
下载所述业务模块中新版的程序集文件生成新版业务模块,并创建新的应用程序域承载新版业务模块;
将新版业务模块扩展至模块管理容器,并加载新版业务模块。
另外,本发明以开发一个工业设备运行监控系统为例,具体说明实施过程。
工业设备运行监控系统包含:登录窗口、主窗口、菜单栏、工具栏。其中主窗口是根据菜单栏和工具栏的操作来进行内容呈现。
业务模块包括:监控模块、设备设置模块、设备操控模块。
此系统要兼容1.0、2.0两种型号设备,两种工业设备具有相同用户界面,但是监控模块和设备设置模块的逻辑不同,而且新设备的菜单栏和工具栏要展示额外的按钮。
在系统运行时,要从1.0切换到2.0设备,期间系统不能重启。此外,要求该程序具有良好的扩展性,为以后支持3.0、4.0的设备提供基础。
1.创建项目,引入本发明的框架库;
2.将业务模块进行拆分和抽象,对每个业务模块形成抽象层;
其中登录窗口、菜单栏、工具栏的抽象层,框架已经提供。还需要增加监控模块抽象层、设备设置模块抽象层、设备操控模块抽象层。
3.开发任务分配
登录窗口;
主窗口;
菜单栏-1.0;
菜单栏-2.0;
工具栏-1.0;
工具栏-2.0;
监控模块-1.0;
监控模块-2.0;
设备设置模块-1.0;
设备设置模块-2.0;
设备操控模块;
按照上述任务列表,可以进行开发任务的分配,基于此框架的模块开发可以保证互不干扰,相互独立。即使模块间有关联,也可以通过抽象层解决。开发过程中可以根据需要引用框架提供的GUI库、MVVM库、自定义控件、通信库等。所有模块都采用框架提供的热插拔方式对外提供接口。
4.开发完成后,开始进程模块配置。
可以使用数据库也可以使用文件,将设备型号与模块的对应关系进行存储。图5展示了设备型号与模块关系的配置清单
5.程序打包发布。
打包时,上述的所有模块都不需要添加到软件的安装包内,最终的软件安装包占用会特别小。这些未添加到安装包的模块文件全部在程序启动时通过当前设备型号,去检索模块文件清单,然后进行文件下载,下载后读取文件加载到程序内,最终程序开始运行。
6.在对设备1.0监控了一段时间后,要切换到监控设备2.0。此时只需要在程序内进行型号切换,所有1.0的模块文件就会全部删除,进而去查询设备2.0的模块清单,根据清单内容下载模块文件,最后完成模块加载。
7.现在企业引进了设备3.0,设备3.0的设备设置模块引入了新功能,其他模块和设备2.0完全一样。此时只需要开发设备设置模块3.0,然后进行配置。图6展示设备3.0的配置清单。然后程序依然不需要退出,只需要切换版本到3.0、重复上述步骤6的操作即可。
图7完整的展示使用了本发明开发原生windows桌面软件的过程。通过引入本发明的框架库,开发人员的任务边界更加清晰,模块间的集成都依赖于抽象结构开发人员的进度不会对其他模块造成影响。
图8展示引入本框架后的软件启动与自动组装的过程。
1.首先通过预设的关键字获取依赖项/模块清单。
2.根据清单内容去下载对应的程序集文件,或者是在本地查找(离线情况)。
3.加载程序集文件,通过清单内容中的类型,包名等信息反射获取模块类型。
4.将模块类型注入到IOC容器(同模块管理容器)。
5.从IOC容器中获取模块加载顺序(模块加载顺序管理也是一个模块)。
6.按照加载顺序从容器中获取->加载->执行对应模块。图8中所示的是一个比较典型的场景:
登录模块->权限模块->主窗口(包含菜单栏、工具栏、通知栏…业务模块1、业务模块2)。
其中,基础模块:日志模块、异常处理模块等是框架预先注入到容器中的。
最重要的,所有模块都是支持热插拔方式注入到模块管理容器,程序在运行过程中可以随时卸载、更新、重新加载这些模块。
本发明独创性地提出一种开放式和一站式解决原生windows桌面开发框架的用于大型复杂Windows原生桌面开发的方法及系统,结合动态模块组装,模块热插拔。
本发明的创新点如下:
1.创造性地提出一种动态模块组装的方法,区别于传统的划分抽象的业务模块,使用配置文件进行细粒度的功能控制。该方法直接以程序集\类为模块单位,开发者通过工具或web页面完成对类和程序集的配置。程序启动时检索配置项,得到程序集信息\类信息,然后进行加载和反射,结合当前流行的依赖注入模式达到更彻底的解耦和模块化。避免了繁琐的条件判断、大量无效的逻辑性代码。
2.创造性的设计一种模块热插拔的方法,区别于目前面向特别开发语言的一些方法,本方法采用应用程序域COM组件结合的方式,无论是托管的程序集还是非托管的程序都能实现热插拔,并且是自动识别程序集的类别,分别进行支持。该方法彻底解决了windows上程序集加载后无法卸载的问题,并且避免了进程间通信等一些增加系统结构复杂性的方式。完全使用代码解决。
3.创造性地将软件框架的功能部分与非功能性部分进行了整合,区别于传统的开发框架只针对软件开发的某一环节或者模块。基于目前windows原生桌面软件产品的共性越发集中这一事实,该方法对其产品共性,技术共性进行了深入挖掘和抽象,最终实现了一站式解决windows原生桌面开发的所有问题这一目标。该方法为开发者提供了windows桌面开发的全环节,全维度支撑,让开发者告别一些复杂重复的编码工作,专注于业务功能的实现。
以上所述仅是对本发明的优选实施例及原理进行了详细说明,对本领域的普通技术人员而言,依据本发明提供的思想,在具体实施方式上会有改变之处,而这些改变也应视为本发明的保护范围。
Claims (7)
1.用于大型复杂Windows原生桌面开发的方法,其特征在于,包括如下步骤:
S1,创建开发项目,引入底层基础库和功能库;
S2,注册模块管理容器;
S3,将业务模块进行拆分和抽象,对每个业务模块形成抽象层,并通过动态模块组装方式,完成业务模块的选择和加载;
S4,对开发项目中的任务进行分配,并通过热插拔方式对外提供接口;
S5,配置业务模块信息,将设备型号与业务模块的对应关系进行存储;
S6,通过当前设备型号,检索业务模块文件清单,并进行业务模块文件下载,下载后读取业务模块文件并加载到程序内,最终使程序开始运行;
步骤S3包括如下步骤:
S31,每个业务模块均包括新版模块和旧版模块;将每个业务模块的新旧两种场景的业务接口进行抽象,得到抽象层;
S32,新版模块和旧版模块分别具有新代码和旧代码,通过新代码和旧代码分别将新版模块和旧版模块与抽象层连接;
S33,将新旧两套代码进行单独打包,形成一新一旧两个程序集文件,并存储到指定位置数据库或者本地文件夹,获得新旧两个版本软件;
S34,旧版软件通过旧版关键字获取到旧版模块对应的程序集文件相关信息,同时将旧版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为旧版模块的实例;
S35,新版软件通过新版关键字获取到新版模块对应的程序集文件相关信息,同时将新版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为新版模块的实例;
步骤S4包括如下步骤:
S41,指定需要更新的业务模块,并卸载所述业务模块所在的应用程序域;
S42,下载所述业务模块中新版的程序集文件生成新版业务模块,并创建新的应用程序域承载新版业务模块;
S43,将新版业务模块扩展至模块管理容器,并加载新版业务模块;
其中,每个应用程序域都是隔离的,用于单独进行创建,加载和卸载。
2.根据权利要求1所述的用于大型复杂Windows原生桌面开发的方法,其特征在于,步骤S4中,对于托管模块使用应用程序域进行调用,对于非托管模块使用COM接口调用;所述托管模块为运行于CLR公共语言运行时环境的模块。
3.根据权利要求2所述的用于大型复杂Windows原生桌面开发的方法,其特征在于,步骤S41中,设定卸载的应用程序域为旧版应用程序域;所述旧版应用程序域中承载旧版业务模块;所述旧版业务模块对应的旧版程序集文件解除占用并删除。
4.根据权利要求3所述的用于大型复杂Windows原生桌面开发的方法,其特征在于,步骤S35中所述程序集文件相关信息包括程序集文件的名称和类别。
5.用于大型复杂Windows原生桌面开发的系统,用于实现权利要求1-4任一项所述的用于大型复杂Windows原生桌面开发的方法,其特征在于,所述用于大型复杂Windows原生桌面开发的系统包括:
框架引入模块,用于创建开发项目,引入底层基础库和功能库;
模块管理容器注册模块,用于注册模块管理容器;
动态模块组装模块,用于将业务模块进行拆分和抽象,对每个业务模块形成抽象层,并通过动态模块组装方式,完成业务模块的选择和加载;
热插拔模块,对开发项目中的任务进行分配,并通过热插拔方式对外提供接口;
信息配置模块,用于配置业务模块信息,将设备型号与业务模块的对应关系进行存储;
文件下载和运行模块,用于通过当前设备型号,检索业务模块文件清单,并进行业务模块文件下载,下载后读取业务模块文件并加载到程序内,最终使程序开始运行。
6.根据权利要求5所述的用于大型复杂Windows原生桌面开发的系统,其特征在于,所述动态模块组装模块具体如下:
每个业务模块均包括新版模块和旧版模块;将每个业务模块的新旧两种场景的业务接口进行抽象,得到抽象层;
新版模块和旧版模块分别具有新代码和旧代码,通过新代码和旧代码分别将新版模块和旧版模块与抽象层连接;
将新旧两套代码进行单独打包,形成一新一旧两个程序集文件,并存储到指定位置数据库或者本地文件夹,获得新旧两个版本软件;
旧版软件通过旧版关键字获取到旧版模块对应的程序集文件相关信息,同时将旧版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为旧版模块的实例;
新版软件通过新版关键字获取到新版模块对应的程序集文件相关信息,同时将新版程序集文件加载到程序中,通过反射创建抽象层的实例,所述实例为新版模块的实例。
7.根据权利要求5所述的用于大型复杂Windows原生桌面开发的系统,其特征在于,所述热插拔模块具体如下:
指定需要更新的业务模块,并卸载所述业务模块所在的应用程序域;
下载所述业务模块中新版的程序集文件生成新版业务模块,并创建新的应用程序域承载新版业务模块;
将新版业务模块扩展至模块管理容器,并加载新版业务模块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211134033.6A CN115237386B (zh) | 2022-09-19 | 2022-09-19 | 用于大型复杂Windows原生桌面开发的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211134033.6A CN115237386B (zh) | 2022-09-19 | 2022-09-19 | 用于大型复杂Windows原生桌面开发的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115237386A CN115237386A (zh) | 2022-10-25 |
CN115237386B true CN115237386B (zh) | 2022-12-27 |
Family
ID=83682017
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211134033.6A Active CN115237386B (zh) | 2022-09-19 | 2022-09-19 | 用于大型复杂Windows原生桌面开发的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115237386B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108446102A (zh) * | 2017-02-15 | 2018-08-24 | 中国石油化工股份有限公司 | 一种开发部署应用程序的一体化系统及方法 |
CN110275700A (zh) * | 2019-06-17 | 2019-09-24 | 河南大学 | 一种基于electron的跨平台桌面应用程序开发框架及方法 |
CN112394917A (zh) * | 2021-01-20 | 2021-02-23 | 博智安全科技股份有限公司 | 跨平台安全服务软件构建方法、装置、设备及存储介质 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8065204B2 (en) * | 2005-09-29 | 2011-11-22 | Sony Corporation | System and method for software integration and factory deployment |
US20110088011A1 (en) * | 2009-10-14 | 2011-04-14 | Vermeg Sarl | Automated Enterprise Software Development |
CN106406911B (zh) * | 2016-10-26 | 2019-11-15 | 国云科技股份有限公司 | 一种计算机软件系统功能组件化的方法 |
CN108933760B (zh) * | 2017-05-25 | 2021-01-08 | 中国电信股份有限公司 | 安全业务控制方法和系统 |
CN113094028B (zh) * | 2021-04-29 | 2023-11-28 | 成都星云智联科技有限公司 | 一种Windows桌面程序开发系统、方法及相关组件 |
CN113076096B (zh) * | 2021-04-29 | 2024-04-23 | 成都星云智联科技有限公司 | 一种桌面应用程序开发方法、装置、设备及存储介质 |
CN113448559A (zh) * | 2021-07-13 | 2021-09-28 | 壹药网科技(上海)股份有限公司 | 一种针对多开发项目的全球广域网前端的开发系统和方法 |
-
2022
- 2022-09-19 CN CN202211134033.6A patent/CN115237386B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108446102A (zh) * | 2017-02-15 | 2018-08-24 | 中国石油化工股份有限公司 | 一种开发部署应用程序的一体化系统及方法 |
CN110275700A (zh) * | 2019-06-17 | 2019-09-24 | 河南大学 | 一种基于electron的跨平台桌面应用程序开发框架及方法 |
CN112394917A (zh) * | 2021-01-20 | 2021-02-23 | 博智安全科技股份有限公司 | 跨平台安全服务软件构建方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN115237386A (zh) | 2022-10-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111324571B (zh) | 一种容器集群管理方法、装置及系统 | |
US5535389A (en) | Business process objects with associated attributes such as version identifier | |
US5864850A (en) | Asynchronous-event opening component of a network component system | |
US5768510A (en) | Object-oriented system, method and article of manufacture for a client-server application enabler system | |
EP0777943B1 (en) | Extensible, replaceable network component system | |
US6968535B2 (en) | Service mapping method of enterprise application modeling and development for multi-tier service environments | |
US6463565B1 (en) | Method for designing object-oriented table driven state machines | |
EP0827077B1 (en) | Object-oriented system, method and computer program for a client-server failure reporting process | |
EP0836139A2 (en) | Object-oriented system, method and article of manufacture for a client-server graphical user interface framework in an interprise computing framework system | |
EP0822491A2 (en) | Object-oriented system, method and article of manufacture for migrating a client-server application | |
EP0834804A2 (en) | Object-oriented system, method and article of manifacture for a client-server state machine in an interprise computing framework system | |
EP0844558A2 (en) | Object-oriented system, method and article of manufature for a client-server event driver message framework in an interprise computing framework system | |
US6816902B1 (en) | Method and system for improving workflow performance in workflow application systems | |
EP0822487A2 (en) | Object-oriented system, method and article of manufacture for a client-server session WEB access in an interprise computing framework system | |
EP0834805A2 (en) | Object-oriented system, method and article of manufacture for a client-server session manager in an architecture computing framework system | |
EP0822490A2 (en) | Object-oriented system, method and article of manufacture for a client-server communication framework | |
EP0822489A2 (en) | Object-oriented system, method and article of manufacture for a client-server system with a client program cache | |
EP0827074A2 (en) | A system, method and article of manufacture for a distributed computer system framework | |
EP0786109A2 (en) | Object-oriented system for configuration history management | |
EP0827073A2 (en) | Object-oriented system, method and article of manufacture for a client-server-centric enterprise computing framework system | |
US20080059940A1 (en) | System and method for implementing a safe framework | |
US20080059949A1 (en) | System and method for implementing a safe framework | |
CN115237386B (zh) | 用于大型复杂Windows原生桌面开发的方法及系统 | |
CN112231231B (zh) | 云端服务的调试方法、系统及装置 | |
CN114490694A (zh) | 一种业务规则处理方法、装置、服务器及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |