推荐一个IT老鸟肝了2月有余的免费开源WPF企业级开发框架

一个新学WPF的IT老鸟,肝了2个月做了这么一个WPF企业级开发框架,站长clone学习,觉得甚是不错。这是一个使用了Prism搭建的插件式框架,封装了DataGrid的使用,使整个框架子模块简单易学、易扩展,特别是作者还写了一个系列博客教程,值得点赞。
下面是作者博文系列首篇:WPF企业级开发框架搭建指南(启示录),2020从入门到放弃
这个系列的文章旨在记录工作中使用WPF开发新的医疗项目中,有感于必须统一掉一些规范上的事情,并且提高团队开发效率,遂折腾了这么一个半吊子的框架,这个标题WPF企业级开发框架搭建指南,2020从入门到放弃可能会唬住一些人,但看到这些零碎文字的朋友就凑和着看吧,如果能帮助到你,那也荣幸了。
WPF技术是一个很不错的技术,但一直没有上手过正式的项目,趁在做这个医疗项目时,遂搭建一个WPF开发框架,目的是为了统一WPF开发并提高开发效率;我对WPF技术算是零基础,现学现卖,用这些不成体系的文字予以记录一些想法和实践。
文章目录
WPF企业级开发框架搭建系列文章导航
- WPF企业级开发框架搭建指南(启示录)
 - JHRS开发框架之基础类库
 - JHRS开发框架之第三方框架选型
 - JHRS开发框架之WPF调用Web API封装
 - JHRS开发框架之客户端入口项目
 - JHRS开发框架之各子系统如何整合
 - JHRS开发框架之怎样设计合理的ViewModel基类
 - JHRS开发框架之公用组件用户控件的封装
 - JHRS开发框架之建议遵循的一些建目录文件原则
 - JHRS开发框架之WPF数据验证
 - JHRS开发框架之ViewModel相互传参和弹框回传参的解决办法
 - JHRS开发框架之踩坑记(终章)
 
WPF管理系统开发框架设计图
在正式开始WPF开发框架搭建之前,做了一些技术选型和在群里面咨询了下对WPF技术比较了解的群友,当中就属dotnet9.com的站长经常被笔者叨扰。先来说说我期望中的开发框架要实现哪些功能。
在开始搭建之前呢,还是晾一下最终的架构图吧。

上图就是折腾出来的一个框架,图不美观的话,大伙也就凑合着看吧。下图是解决方案:

- 开源地址:https://github.com/jhrscom/jhrs
 - 官方博客:https://jhrs.com
 - 用到插件:https://marketplace.visualstudio.com/items?itemName=PeterSpa.XamlBinding
 
开发环境
因为项目是使用WPF来开发的,自然基于【MVVM】的理念搭建了这么一个快速开发框架,适用于开发【传统类型的管理系统】,并通过调用web api的方式来完成所有的业务操作,在WPF的Page,窗体(Window),用户控件的后置代码,几乎不会有任何的业务代码,除了一些控制界面行为的功能。
在搭建这个框架时,是基于最新的 【 .net 5】用的技术版本是比较新的,演示代码中,wpf也是使用 .net 5。

使用技术说明
- 技术平台:.Net 5.0
 - 技术框架:WPF + Prism+ AspectInjector + Refit
 - IoC组件:Prism自带Prism.Unity
 - 数据序列化:Newtonsoft.Json,可替换
 - 日志记录:系统自带
 
解决方案详解
解决方案从上到下依次为:
JHRS.Core(客户端业务核心)

在JHRS.Core这个库里面,各个目录功能说明如下:
- Aop:实现了一个点击按钮显示转圈圈效果的类,一般用于加载数据,点击按钮从服务器获取数据让用户等侯片刻。
 - Apis:保存着代码生成工具【JHRS.GenerateAPI】自动生成的接口,该工具可以在线解析swagger生成供调用的接口,参见这里(使用该工具需要设置swagger地址,另外有bug的话,自己修改下就可以了)。
 - Controls:定义了WPF界面使用的公用控件(保存在Controls目录),如通用表格(DataGrid),下拉框等,凡公用的控件,都可以保存在此目录。
 - Enums:公用的枚举,各个模块可以引用。
 - Events:事件类,Prism自带事件总线,相应的事件类在这个目录创建,具体应用参见这里。
 - Extensions:扩展类
 - Identity:身份认证,即登录系统后,从服务器端获取到的身份认证会话信息(用户,token等)。
 - Models:各个模块的DTO对象,一般是根据swagger解析出各个接口的实体对象(输入,输出DTO)。
 - Modules:模块的辅助类。
 - ViewModels:这个目录里面定义了ViewModel的基类,处理各个功能Page业务的ViewModel类,需要从这里继承对应的类,如管理页面继承BaseManagePageViewModel,而新增编辑页面继承BaseDialogPageViewModel类等。并且在基类里面定义了公共方法,如消息提示框,消息弹框,打开模态窗口等,效果见下方所示。
 
JHRS.Shell(WPF客户端入口程序)

JHRS.Shell是WPF客户端项目的入口程序,并且定义了整个系统公用的消息提示框,模态窗口风格,主窗口等;登录的入口也是在这里定义的,登录系统后,可以自行实现权限功能加只加载对应的子模块(子系统);在程序启动时,会自动做一些初始化操作,扫描程序集自动注入相关功能,具体实现参见这里。
消息提示框

消息弹框

确认消息框

模态窗口

遮罩层效果(蒙层效果或Loading效果)
遮罩层效果一般用于点击按钮,加载数据时使用,即调用接口到数据呈现中间有一个等待的过程,就可以显示出来,因此在框架中通过AOP方式封装了这么一个效果,调用时在相关的地方标记一个特性即可。先来看看效果。

该效果是直接从CSDN抠过来的,然后整到到代码里面去的,纯演示目的。
参考链接:https://blog.csdn.net/lhx527099095/article/details/8005095
modules解决方案文件夹

在modules这个解决方案文件夹里面的是各个子模块,也就是各个子系统,例如【JHRS.OutpatientSystem】是WPF项目的子系统之一(门诊模块);在各子系统中,最外层拥有一个Module的类(OutpatientSystemModule),需要实现IModule接口供Prism自动扫描注册到容器里面。
在子模块中,目录的组织原则如下。
目录组织原则
在每一个子系统中,最外层的一个模块类,名称规则为:【模块名称+Module】,编写这个类是为了使用Prism加载这个模块。
JHRS(基础类库)

基础类库,可以任意扩展,该库可以供其它所有库引用。
JHRS.GenerateAPI(代码生成工具)
该工具是在线解析swagger生成供Refit调用的接口,生成的接口如下:

调用接口的示例代码如下:
最后
对于WPF开发来说,我并不是很熟悉,这段时间以来一直网上学习和借鉴一些开源的框架,再结合实际项目而整出来的这个开发框架;可能对于从事WPF开发的朋友来说有一定的借鉴意义。
完整的项目代码已经开源到github上面。在这个项目中,并不包含web api的项目。
本文markdown原文分享:https://dotnet9.com/2020-09-07
除非注明,文章均由 Dotnet9 整理发布,欢迎转载。
转载请注明:
作者:Dotnet9
链接:https://dotnet9.com/16199.html
来源:Dotnet9
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

欢迎关注站长公众号:Dotnet9
推荐一个IT老鸟肝了2月有余的免费开源WPF企业级开发框架的更多相关文章
- 撒花,推荐一下我怒肝的 GitHub
		
缘起 之前一直有很多小伙伴们找我,让我聊一聊如何学习 Java ,我都直接回复了一个思维导图,后来想一想觉得回答不是很认真,我的初衷是想让小伙伴们根据思维导图中的知识点,采取各个击破 的原则,哪里不会 ...
 - 推荐一个lamp的一键安装包
		
本来我是一直用的nginx的,现在安全者的服务器是用的tengine,稳定性就不用多说了! 前段时间用thinkphp写了两个两个项目,刚开始放到了国外的服务器上,环境也是lnmp的,最后发现ngin ...
 - 1024|推荐一个开源免费的Spring Boot教程
		
2020-1024=996! 今天,星期六,你们是否加班了?我反正加了!早上去公司开了一早上会,中午回家写下了这篇文章. 今天,我要推荐一个开源免费的Spring Boot项目,就是我最近日更的Spr ...
 - 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器
		
在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...
 - 推荐一个实用的css工具
		
后台程序员整天在和数据打交道,天天的活就是抱着mysql抠数据,如果让他去写网站的样式,就让人感觉力不从心,所以推荐一个twitter的团队开发的东西,几乎囊括了网站所需的样式,http://www. ...
 - 前端设计师也有必要学习seo,推荐一个seo博客
		
做前端设计师有一段时间了,现在越来越觉得作为一个前端设计师,必须要懂一些seo的知识. 因为公司的seo们,总是在网站做好以后,提出各种各样的网站修改的需求. 如果前端设计师,能够了解一些基本的seo ...
 - 。求推荐一个usb集线器的购买网址
		
笔记本蓝屏了,虽然后来让笔记本自己呆了好久,它冷静下来后我重新启动它,它又恢复了正常,但是我至今也没搞懂蓝屏的原因,深切地领悟到没文化不可怕,像我这样一知半解的最可怕... ------LYQ --- ...
 - 推荐一个 angular 图像加载插件
		
推荐一个简单的 Angular 图片加载插件:vgSrc,插件根据图片资源的不同加载状态,显示不同图片,亲测兼容IE-8. 使用 推荐使用 bower 加载: bash bower install v ...
 - 推荐一个linux下的web压力测试工具神器webbench
		
推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29 来源: 评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...
 
随机推荐
- python3.4嵌套循环项目:买房分期付款(1)
			
#案例:买房分期付款24万(10年期限) i=1#定义年份sum1=0while i<=10: print("第",i,"年到了......") j=1# ...
 - C语言学习笔记之原码反码补码
			
原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0 0变1 补码:机器 ...
 - webgl实现发光线框(glow wireframe)效果
			
在之前这篇文章, WebGL 单通道wireframe渲染 我们介绍了webgl如何实现单通道wireframe的效果. 本篇文章就是在此技术原理基础之上,来实现发光的wireframe效果. 要实现 ...
 - MyBatisPlus乐观锁,乐观锁竟然如此简单
			
乐观锁 在便是过程中,我们经常会被问到乐观锁,悲观锁,都非常简单 乐观锁:顾名思义,思想十分乐观,总是认为不会出现问题,无论什么都不去上锁!如果出现了问题,就再更新测试 悲观锁:顾明思义,思想十分悲观 ...
 - 算法学习笔记:最近公共祖先(LCA问题)
			
当我们处理树上点与点关系的问题时(例如,最简单的,树上两点的距离),常常需要获知树上两点的最近公共祖先(Lowest Common Ancestor,LCA).如下图所示: 2号点是7号点和9号点的最 ...
 - MySQL“被动”性能优化汇总!
			
年少不知优化苦,遇坑方知优化难. --村口王大爷 本文内容导图如下: 我之前有很多文章都在讲性能优化的问题,比如下面这些: <switch 的性能提升了 3 倍,我只用了这一招!> < ...
 - JavaScript 跨站伪造请求-CSRF
			
CSRF: Cross-Site Request Forgery CSRF 概念 `定义`: 是一种对网站的而已利用,也被称之为one-click-attack 或者 session riding, ...
 - RoBERTa:一个调到最优参的BERT
			
RoBERTa: A Robustly Optimized BERT Pretraining Approach. Yinhan Liu, Myle Ott, Naman Goyal, et al. 2 ...
 - JavaScript在HTML中的基础用法总结
			
网页主要由三部分组成,分别为html.CSS和Javascript.如果说HTML是肉身,CSS是皮相,那Javascript就是灵魂.因此,三者的联系与融合则至关重要.本文就来为大家讲解一下Java ...
 - AMD 5700 XT显卡装ubuntu18.04.* 驱动的问题解决(全)
			
公司开发需要测试新的 AMD显卡,由于测试服务器上的显卡是英伟达的显卡所以换完后要安装相应的驱动.由于之前装机的同事装的ubuntu是18.04.5 恰巧18.04.5在amd官网上没有相匹配的驱动( ...