SimpleAdmin手摸手教学之:项目架构设计2.0
一、说明
在SimpleAdmin1.0版本中,我将整体项目结构分为三大块,分别为架构核心、业务模块和应用服务。随着1.0版本的封版,回去再看我之前的项目架构,也暴露了一些问题,比如在1.0版本中,Signalr和Mqtt只能二选一,这显然是不科学的,因为这两种虽然都可以作为消息通知,但是显然可以有更多的应用场景,所以如果两者只能用其一的话,显然整个项目架构就不灵活了。并且随着功能越来越多,太多的代码集合在一个应用中,仅仅以文件夹区分功能模块的话,会不会导致项目越来越臃肿?慢慢的就成了屎山了。这个时候我就想到了很多系统都会采用的插件式开发的模式,在业务模块中,除了基础的功能之外,一些拓展性功能采用插件的方式创建在独立的类库中,这样的话我们想要用哪个功能就引用该功能的项目,如果功能有问题我们也能快速定位到代码的位置,非常方便。于是,我就在SimpleAdmin1.0的基础上,对现有架构进行重新设计,以下是2.0架构设计的一些特色:
插件式开发:分层明确,减少代码耦合性,增强代码可读性,避免项目成为屎山。Signalr和Mqtt并存:将Mqtt和Signalr都封装成插件使用,想要使用哪个就引用那个插件,并且支持同时引用。支持MemerCache:支持内存缓存,无需依赖redis即可启动项目。
二、项目结构
2.0的项目结构主要分为架构核心、系统插件、业务模块和应用服务,相比于1.0,多了一个插件层。
如图所示:

三、分层说明
3.1 架构核心
SimpleAdmin.Core->核心层
核心层,公共组件,常量,枚举,通用方法等其他核心代码,可以被任何项目引用,不依赖其他项目。
│ Core.Development.json --> 开发环境配置
│ Core.Production.json --> 生产环境配置
│ Startup.cs --> 启动类
├─Attributes --> 特性
├─BaseInput --> 共用输入参数(分页,ID传参等)
├─Components --> 公共组件
├─Const --> 常量
├─Dto --> 数据类
├─Extension --> 拓展
├─UnifyResult --> 统一返回结果
└─Utils --> 工具类(验证码,图片处理,种子数据处理等)
3.2 系统插件
系统插件是新增的一层,目的是把一些通用的代码抽取出来,封装成类库插件的形式,给不同的项目引用,如果需要哪个功能,直接引用对应的插件即可,非常清晰。哪个功能有问题直接去对应的插件查找,非常方便。这里不做过多的介绍,后面将单开一篇叫成功详细介绍插件功能。
3.2.1 核心插件
核心插件通常放置一些系统通用插件,如orm,缓存等,这些是系统的基础,基本上所有业务模块都需要用到的插件。
├─SimpleAdmin.Plugin.Aop --> Aop插件
├─SimpleAdmin.Plugin.Cache --> 缓存插件
├─SimpleAdmin.Plugin.CodeFirst --> CodeFirst数据库初始化插件
├─SimpleAdmin.Plugin.Core --> 插件核心,被其他插件引用
├─SimpleAdmin.Plugin.SqlSugar --> SqlSugar ORM插件
3.2.2 系统模块插件
系统模块插件主要是对应的我们SimpleAdmin.System层所用到的插件。
├─SimpleAdmin.Plugin.Batch --> 批量编辑插件
├─SimpleAdmin.Plugin.Gen --> 代码生成器插件
├─SimpleAdmin.Plugin.ImportExport --> 批量导入导出插件
├─SimpleAdmin.Plugin.Mqtt --> MQTT插件
├─SimpleAdmin.Plugin.Signalr --> Signalr插件
3.3 业务模块
SimpleAdmin.System->系统应用层
系统应用层,主要是提供系统应用服务给Api接口层调用,SimpleAdmin的主要功能都由该层实现。
│ Startup.cs --> 启动类
│ System.Development.json --> 开发环境配置
│ System.Production.json --> 生产环境配置
├─EventSubscriber --> 事件总线
├─Oss --> 对象存储
├─Services --> 服务(系统功能接口加实现)
└─UserManager --> 用户中心(获取当前请求用户信息)
SimpleAdmin.Application->业务应用层
业务应用层,主要是业务代码的编写,可以将自己的业务写在该层,当然也可以自己新建一层写。本系统该层主要是用作数据权限示例。
│ Application.Development.json --> 开发环境配置
│ Application.Production.json --> 生产环境配置
│ Startup.cs --> 启动类
└─Service --> 服务(业务功能实现)
3.4 应用服务
3.4.1 Web
SimpleAdmin.Web.Entry->启动层
Web 入口层,主要作用就是作为程序入口,没有什么实际业务,没啥好讲的,主要是一些全局的设置,详情见appsettings.json
│-- appsettings.json --> 启动层配置文件
│-- ip2region.db --> 解析ip用的数据库文件
│-- Program.cs --> 启动类
SimpleAdmin.Web.Core->WebApi接口层
Api接口层,存放web应用所需要用到的代码,如组件,控制器,中间件,过滤器等。
│ Startup.cs --> 启动类
│ Web.Development.json --> 开发环境配置
│ Web.Production.json --> 生产环境配置
├─Components --> 存放Web组件
├─Controllers --> 存放控制器
├─Filter --> 过滤器
├─Handlers --> 处理器
└─Logging --> 操作日志功能
└─Options --> 配置文件转实体选项类
3.4.2 后台服务
SimpleAdmin.Background->后台服务层
后台服务层,作为定时任务,MQTT或其他服务载体常驻于后台,不依赖于Web,不会因web服务升级而停止。这样做的好处就是不会被iis内存回收,也不会因为web服务升级而停止工作。
│ Background.Development.json --> 开发环境配置
│ Background.Production.json --> 生产环境配置
│ MqttWorker.cs --> mqtt后台任务
│ Program.cs --> 启动类
├─Dto --> 数据转换类
四、总结
SimpleAdmin2.0的架构在1.0的基础上进行了很大的调整,回头再看1.0的代码确实有点屎山那味了,还好在1.0完成之后并没有急着开发新的功能而是重新梳理代码逻辑,优化架构,为以后的新功能开发打好基础,这对我自己来说也是一种进步。在日常工作中也一样,如果你回头看几个月之前写的代码发现可以以更好的方式实现时,说明你的代码水平已经进步了。或许在不久的将来,2.0的架构设计也会被推翻重新设计也说不定,希望能和使用SimpleAdmin开发的coder们一起进步。
SimpleAdmin手摸手教学之:项目架构设计2.0的更多相关文章
- 【手摸手,带你搭建前后端分离商城系统】02 VUE-CLI 脚手架生成基本项目,axios配置请求、解决跨域问题
[手摸手,带你搭建前后端分离商城系统]02 VUE-CLI 脚手架生成基本项目,axios配置请求.解决跨域问题. 回顾一下上一节我们学习到的内容.已经将一个 usm_admin 后台用户 表的基本增 ...
- 【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)
前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不 ...
- 【手摸手,带你搭建前后端分离商城系统】01 搭建基本代码框架、生成一个基本API
[手摸手,带你搭建前后端分离商城系统]01 搭建基本代码框架.生成一个基本API 通过本教程的学习,将带你从零搭建一个商城系统. 当然,这个商城涵盖了很多流行的知识点和技术核心 我可以学习到什么? S ...
- 【转】手摸手,带你用vue撸后台 系列二(登录权限篇)
前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自己是一个业务猿,每天被我司的产品虐的死去活来,之前又病了一下休息了几天,大家见谅. 进入正题,做后台项目区别于做其它的项目,权限验证与安全性是非常 ...
- 【转】手摸手,带你用vue撸后台 系列三(实战篇)
前言 在前面两篇文章中已经把基础工作环境构建完成,也已经把后台核心的登录和权限完成了,现在手摸手,一起进入实操. Element 去年十月份开始用vue做管理后台的时候毫不犹豫的就选择了Elemen, ...
- 【转】手摸手,带你用vue撸后台 系列一
前言 说好的教程终于来了,第一篇文章主要来说一说在开始写业务代码前的一些准备工作吧,但这里不会教你webpack的基础配置,热更新怎么做,webpack速度优化等等,有需求的请自行google. 目录 ...
- 手摸手教你让Laravel开发Api更得心应手
https://www.guaosi.com/2019/02/26/laravel-api-initialization-preparation/ 1. 起因 随着前后端完全分离,PHP也基本告别了v ...
- 手摸手教你使用vue-cli脚手架-详细步骤图文解析[vue入门]
写在前面: 使用 vue-cli 可以快速创建 vue 项目,vue-cli很好用,但是在最初搭建环境安装vue-cli及相关内容的时候,对一些人来说是很头疼的一件事情,本人在搭建vue-cli的项目 ...
- YApi——手摸手,带你在Win10环境下安装YApi可视化接口管理平台
手摸手,带你在Win10环境下安装YApi可视化接口管理平台 YApi YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建 ...
- 手摸手带你用Hexo撸博客(二)之配置主题
在上一篇博客手摸手带你用Hexo撸博客(一)中主要介绍了博客的初步搭建 今天我们继续讲如何在Hexo搭建的博客中应用主题 官网选择自己喜欢的主题 点击这里Hexo主题进入官网主题页面 然后选择自己喜欢 ...
随机推荐
- LayUI 简单的全选和反选小例子
比较简单实用,直接上代码,主要就是 lay-filter="ischange" 触发事件和 checkbox 的 class="ids" 对上就行: H ...
- UE C++教程之接口 UINTERFACE
我是谁不重要,重要的是,我能做什么. 近期笔者在进行UE的开发时,实现多武器的换弹与开火需要用到接口.而笔者以前是做Unity开发的,遂没有使用过UE C++的UINTERFACE,而这个接口在使用过 ...
- java初学者-向一个长度为5的整型数组中随机生成5个1-10的随机整数 ,要求生成的数字中没有重复数
public static void main(String[]args){ //定义一个数组 长度为5:角标为4 int []arr=new int[5]; for(int i=0;i<5;i ...
- Spring系列之验证-14
目录 Java Bean 验证 Bean 验证概述 配置 Bean 验证提供程序 注入验证器 配置一个`DataBinder` Spring MVC 3 验证 Java Bean 验证 Bean 验证 ...
- Python pexpect 库的简单使用
一.Python pexpect 库的使用 在终端中许多命令都有与用户交互的场景,例如切换用户时需要手动输入密码,安装应用有时要输入默认配置等.这对 shell 自动化脚本十分不便.expect 命令 ...
- CSS 常用样式-字体属性
字体类样式我们已经学习过字号font-size.字体font-family两个属性,接下来还有几个常用的字体属性. 粗细 font-weight: 作用:设置文字是否加粗显示. 属性名:font-we ...
- aop的一些方注释介绍
//定义切入点 @Pointcut("execution(void com.itheima.dao.BookDao.update())") private void pt2(){} ...
- 在Eclipse 中导入maven项目, progress对话框中出现importing maven project的进度条卡住
一.在Eclipse配置Maven 方法1:在Eclipse上下载,太慢了,不用 方法2:在电脑本地下载,然后Eclipse载入 二.方法2详细步骤 1.官网下载:http://maven.apach ...
- 复杂数据类型(signal)的解读-C语言基础
这一篇文章要探讨的是C语言中复杂数据类型的解读.涉及到signal()函数数据类型的解读(并不解释signal()的作用)以及对于数据类型的理解,属于C语言基础篇. 在开始解读signal()这种复杂 ...
- vue.js拓展无法启用
vue.js拓展无法启用 这里我以自己的谷歌浏览器演示 C:\Users\维磊\AppData\Local\Google\Chrome\User Data\Default\Extensions\nhd ...