C#+WPF上位机开发(模块化+反应式)作者:重庆教主

news2024/9/23 16:33:57

在上位机开发领域中,C#与C++两种语言是应用最多的两种开发语言,在C++语言中,与之搭配的前端框架通常以QT最为常用,而C#语言中,与之搭配的前端框架是Winform和WPF两种框架。今天我们主要讨论一下C#和WPF这一对组合在上位机开发过程中的实际应用。

在这里插入图片描述

一、模块化概念

开发一套完善的软件,离不开良好的架构,而说到架构,在C#中,Prism框架与WPF的配合可谓大大提高了开发效率,原因如下:Prism框架中有IOC容器(分别是unity和dryioc),IOC容器负责管理类的生命周期;另外,Prism框架的WPF版本还有区域管理器(RegionManager)、事件聚合器(EventAggregator),对话框服务(DialogService)、适配器(Adapter)、模块管理器(ModuleManager)等。

除了模块管理器(IModule接口),其他几个重要的管理器都是为了更方便实现界面呈现及业务逻辑开发,那么模块管理器的功能是什么呢?程序员往往会将一个大型的软件项目拆分成小项目(模块),比如上位机系统中会接入各种硬件(工业相机、PLC、数据采集器、扫码枪、控制卡等),良好的软件架构思路是将同一种类型的硬件抽象成一个硬件抽象类,然后,不同型号的硬件与继承这个抽象基类,实现各自硬件的业务逻辑(加载硬件、打开硬件、使用硬件、关闭硬件),要实现这些开发,Prism的模块就派上用场了。也就是将硬件进行模块化,由Prism框架去实现及统一管理。

当然,除了上述的例子,软件的基础库,软件的业务逻辑,同样可以拆成不同的模块,最后由Prism框架统一管理。

二、反应式概念

C#语言为我们提供了一个IObservable接口,也就是设计模式中的观察者模式在C#语言中的具体实现。ReactiveUI框架对此接口进行了扩展,使之变得易用。

在传统的软件开发中,我们对某个属性发生变化后要进行下一步的相应处理时,会主动对判断这个属性的值,然后实现相应的代码逻辑。而在观察者模式下,我们会写一个观察者,由这个观察者去“实时”观察这个属性,一旦观察到属性值发生了改变,会抛出一个通知。

那么,通知谁呢?

谁去订阅了这个观察者,其回调函数都会被触发一次调用,从而达到一个目的,即被观察的那个属性发生改变后会执行事先写好的“某一段代码逻辑”。

这样的开发模式在写上位机软件时非常可靠和易用,因为上位机可能会实时监测下位机的某些参数变化,一旦硬件参数发生变化,软件要相应给出动作(做出反应),这种反应,我们称为反应式编程。

三、软件架构

良好的架构,可以帮助开发人员提高开发效率,减少bug的发生,增强系统的稳定性。我们可以将一个上位机系统分成如下几个方面:

第一是具有通用性的基础类库,这一些类与具体的业务逻辑无关,只帮助处理业务过程中的数据,通常是一些帮助类,或者语言包,本地设置等等;

第二、是硬件模块,上位机开发离不开硬件的接入,而不同的上位机系统,其接入的硬件也是五花入门,比如MES系统,可能最常见的硬件是PLC、扫码枪;而控制系统,则控制卡与各种被控设备的信息反馈最为常见;AOI,AXI等工业视觉检测方面,则接入的硬件除了PLC和控制卡,还有工业相机,光机,光源等等;或者医学方机的上位机,包含了更多的非标设备。

如此多的硬件,如何有序的接入到上位机呢?

答案是,最好将同一种类型的硬件抽象成一个基类,通过接口、抽象类、继承等方面的编程手段,为每一种不同厂家或不同型号的硬件创建一个项目,将这些项目看成是一个个独立的模块,像小孩子玩积木游戏一般,将硬件“堆积”到上位机中,一旦某个型号的硬件想被替换,直接将新硬件的模块加载到上位机即可。

第三,是数据库模块。由于上位机系统运行过程中需要处理大量的数据,其处理结果需要持久化,一般采用文件或数据库的形式进行保存。而数据库的操作就可以单独形成一个模块,这个模块包含抽象类模块和具体的数据库操作类模块,因为最终要保存的数据库可能是mysql、oracle、mssql等不同的数据库,所以最好的方式是为不同类型的数据库的增删改查等操作开发各自的模块,以便管理和替换。

第四,是业务逻辑模块。这一类型的模块会随着不同行业的上位机功能需求,模块的多少会有所不同。尽量将复杂的业务逻辑拆分成独立的小型业务模块,模块与模块之间采用接口通讯,这样做的好处是:减少代码间的耦合程度,尽量开发一些职责单一的类,达到具有良好扩展性的代码架构。
在这里插入图片描述
四、详细设计

在聊完了大致的软件架构,我们来谈谈具体的模块设计。利用vs2022开发软件,一个模块就是一个项目,有的项目是类库,有的是用户控件,有的是窗体,还有的是C++项目,具体的开发如下所示:

为了更清晰明了每个项目的含义,我们制定一套项目(模块)的命名规则:公司名+架构分类名+模块名,比如Company.Application.Main,表示应用层的主模块。

第一、程序入口项目

Company.Application.Shell,这是上位机系统的入口,其实是一个窗体,启动时加载的第一个窗体,其内容由主模块进行填充。

第二、应用层模块

Company.Application.Main,这是上位机的主模块,由Prism框架的区域管理器将此模块导航到Shell窗体中。

Company.Application.Config,这是上位机的系统配置模块。

Company.Application.Login,这是上位机的用户登录模块。

Company.Application.Initialize,这是上位机的硬件加载模块,当然一些软件方面的加载也可放其中。

Company.Application.Share,这是上位机的共享模块,此模块的作用非常重要,负责各个模块的数据通讯。

Company.Application.Menu,这是上位机的菜单模块,负责菜单生成或管理。

Company.Application.More,这个表示其它模块,根据上位机功能而定。

第三、核心层模块

Company.Core,这是上位机的核心模块,与主业务无关,提供一些基础帮助类,全局类等,比如Json文件的序列化与反序列化,对话框管理器、缓存管理、本地语言包管理、各种helper类型等。

Company.Logger,这是上位机的日志模块,可以采用NLog或Log4net等常用组件,此模块也与主业务无关,被其它所有模块所引用,负责打印程序错误信息或调试信息。

Company.UI,这是上位机关于UI的资源模块,如WPF的模板样式定义、程序所引用的图标、图像、字体库、语言包、转换器,用户控件等。

第四、硬件层模块

Company.Hardware.Camera,这是上位机的工业相机抽象类模块,负责定义一台相机的功能,定义相机的配置参数和操作业务流程(如打开相机、使用相机、关闭相机)。

Company.Hardware.Camera.HIK,表示一台海康工业相机,它继承了相机抽象类,并实现其自身的API调用。

Company.Hardware.Camera.Other,表示其它工业相机,other要换成具体的相机名称,说明可能无限扩展其它厂家或其它型号的相机。

Company.Hardware.ControlCard,这是上位机的控制卡抽象基类,负责定义一张控制卡的功能,但不实现具体的操作流程,只规定操作接口,具体操作由子类实现。

Company.Hardware.ControlCard.DMC2610,比如雷赛运动控制卡DMC2610。

Company.Hardware.ControlCard.ADTech632XE,比如众为兴运动控制卡632XE。

其它的硬件都可以采用上述的命名方式去扩展。

第五、数据库模块

Company.Database.Core,这个模块定义了数据库的操作接口,仓储层的抽象类型 等。

Company.Database.EF,这是采用EF框架去对数据库进行增删改查的模块,其中的类型都继承于Core中的抽象类。

接下来,用一张结构图,演示详细的上位机架构
在这里插入图片描述
上位机开发架构设计高清大图链接地址 :

上位机课程思维导图

https://www.processon.com/view/link/64a10419111c1d7d8a19db04

重庆教主的VIP课程

WPF中关于Prism框架的学习课程

https://edu.51cto.com/course/33880.html

C#+WPF上位机开发课程(模块化与反应式编程)

https://edu.51cto.com/course/34143.html

C#+WPF项目实战MVVM模式开发《超市管理系统》

https://edu.51cto.com/course/33794.html

作者:重庆教主

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/922271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SUI 将通过 SUI Foundation 资助 Footprint Analytics 解析其公链数据,为生态系统提供支持

2023 年 8 月 23 日消息,SUI 基金会宣布将赞助链上数据提供商 Footprint Analytics,旨在协助解析公链数据,为 SUI 的生态系统及其开发者提供全方位支持。 Footprint Analytics 将提供完整的数据报表和 API 接口, SUI 链的用户可以…

uniapp离线打包apk - Android Studio

uniapp 离线打包 基于uni-app的andiord 离线打包 开发工具及所需要的jar包​1.将下载的App离线SDK解压打开,找到HBuilder-Integrate-AS ,在Android Studio打开2.打开HBuilder X,发行->原生app本地打包->生成本地打包app资源3.在“HBuil…

GitLab-CI 指南

GitLab CI 指南 前置工作 部署GitLab 部署GitLab-Runner 注册Runner到GitLab docker exec -it gitlab-runner bash # 进入容器 gitlab-runner register #调用register命令开始注册 # 在Gitlab Setting中找到Runners,如下图所示Enter the GitLab instance URL (for example, …

做不做软测都能学的技能,一招化解磁盘空间不足!

如,我有一台服务器,磁盘空间为 50g 现在,使用了一段时间之后,磁盘空间不够了 磁盘空间不够,这个时候,如果你再执行某些写入磁盘的操作就会报错,无法执行。 测试服务器磁盘空间不够,…

最适合运动的耳机类型是什么、适合运动的耳机推荐

作为一位热衷于运动的爱好者,对于运动装备的要求十分严格。家里有很多手环和跑鞋,但在跑步时最喜欢的是听歌。一首好曲子能够改善跑步体验,延缓疲劳感。当然,并非所有的耳机都适合运动使用,选择运动耳机时需要考虑到运…

操作系统-笔记-汇总

目录 📚 前言 🌸章节汇总 🚀 学习心得 ⌛2023年8月24日 星期四 📚 前言 在学习过了《计算机组成原理》之后,对计算机硬件有了一定清晰的认识 从一个架构,到一个个硬件的诞生,一个个线路的规…

Java编程的未来:2023年值得关注的五个趋势

准备好进入Java编程这个不断发展的创新世界了吗?二十多年来,Java一直是编程世界不可或缺的一部分,其重要性始终没有改变。随着企业软件解决方案中对Java的需求持续增长,这一编程语言保持了其作为跨各种设备和集成系统创建复杂软件…

https 的ssl证书过期处理解决方案(lighthttpd)

更换证书:lighthttpd 配置文件位置:/opt/vmware/etc/lighttpd/lighttpd.conf (配置文件的最底部 G快速来到底部) 方案一:阿里云申请免费的证书 这里公司内网环境没有配置域名,可以创建一个临时域名&…

win11 docker-desktop安装记录

win11安装Docker踩坑实录 马上开始正式工作了,需要用到docker,以前在win10上安装过,新电脑是win11,心想肯定会遇到坑,就浅浅记录一下 首先看一下安装要求 需要wsl2 那么就先进行 wsl的更新 wsl --update注意这里网络…

淘宝商品销量数据接口API 淘宝商品价格接口API 淘宝商品详情数据接口API

API是什么? API(Application Programming Interface,应用程序编程接口)是一组定义、规范了不同软件组件之间交互的方法。简单来说,API就是软件系统提供给其他软件系统或开发者使用的一些接口或工具集合。通过使用API&a…

redis漏洞复现

目标机kali1:启动redis服务 攻击机kali2:查看README.md,下载文件 攻击机kali2:进行攻击,在RedisModulesSDK文件夹下创建文件exp.so文件 获取id

已解决WARNING: Pyqt5安装报错解决

废话不多说直接 开干! Pyqt5报错 ERROR: Could not find a version that satisfies the requirement pyqt5 (from versions: none) ERROR: No matching distribution found for pyqt5 更新好像不行 pip install --upgrade pip -i http://mirrors.aliyun.com/pypi/…

k8s 常用命令(三)

1、查看版本信息:kubectl version [rootmaster ~]# kubectl version [rootmaster ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", GitCommit:"ca643a4d1f7bfe34773c74f7952…

湖北咸宁农业三维扫描数字化农业3d打印制造应用-CASAIM中科广电

农业是人类衣食之源、生存之本,是一切生产的首要条件,CASAIM在农业三维扫描和3d打印应用上有丰富经验。 1.三维扫描技术在农业领域的应用 CASAIM三维扫描是集光学、机电和计算机技术于一体的高新无损检测技术,能够对实物的空间外形、结构乃…

python WSGI和ASGI的区别

用户到我们web应用中间经过的相关协议,具体介绍和pyhton相关的WSGI和ASGI,我先把结论列出来,详细描述请看下面介绍! 请大家先记住这张图,带着问题和整个框架去看比较易于了解 CGI,WSGI,ASGI、…

2023亿发一体化新零售POS收银解决方案,打造连锁门店经营新未来

在零售业不断演变的今天,门店形态繁多,收银环节的共通性与差异性并存。传统的通用解决方案已不适应多样化的业态需求,而在线上线下一体化的时代背景下,全渠道经营能力也成为商家的迫切需求。 一体化新零售POS收银系统&#xff0c…

数字化转型,并非“救命良药”!

怎么样实施数字化转型?不同的人有不同的视角。有人认为需要从数字智能硬件开始落地,有人则认为需要先进行技术升级,有人认为达到数据挖掘、数据管理与数据治理才是做好了数字化,也有人认为需要从实际的应用场景去落地…… 信息化…

飞凌嵌入式受邀参加「RISC-V芯片应用交流会」并发表主题演讲

8月23日下午,在第三届RISC-V中国峰会现场,由赛昉科技主办的「RISC-V芯片应用交流会」吸引了诸多行业伙伴和专家到场参与。此次会议旨在分享赛昉科技高性能RISC-V芯片的软件生态、应用产品、解决方案等全面进展,共同探讨RISC-V芯片的未来发展和…

Facebook HiPlot “让理解高维数据变得容易”

在这个全球信息化的时代,数据量呈爆炸式增长,数据的复杂性也是如此。如何有效地处理高维数据并找到隐藏在其中的相关性和模式是一个严峻的挑战。近年来,可视化和可视化分析已被应用于该任务,并取得了一些积极成果。Facebook的新Hi…

【填坑向】MySQL常见报错及处理系列(ERROR! The server quit without updating PID file)

本系列其他文章 【填坑向】MySQL常见报错及处理系列(Communications link failure & Access denied for user ‘root‘‘localhost‘)_AQin1012的博客-CSDN博客翻一下大致的意思就是默认会按照如下的顺序读取配置文件,我上面贴出的配置文…