一、说明
在2.0的架构设计中引用了插件式开发
的概念,将功能模块插件化,以实现更清晰的目录结构,更灵活的解决方案,减少代码的臃肿性。随着2.0版本的使用,也随之暴露出一些问题,之前讲究的插件化并没有完全的实现插件化,我理想的插件化应该是需要某个业务或者功能模块,直接引用该项目既可,不需要进行额外的操作,而现在我们引用了一个业务或者功能模块,还需要一些额外的操作,比如需要把实体放置在Sqlsugar插件中,种子数据放置在CodeFisrs插件中,这样显然并没有达到插件式开发
的目的。也不是我想要的结果。因为接下来准备移动端业务的开发,但是又不想把移动端的业务放置在主工程中,因为不是所有用户都需要,所以决定对现有的架构进行升级优化,实现真正插件化,每一个插件都是独立的,包含实体、种子数据和service类等,主项目需要的时候只需要引用到项目中来就行了。以下是2.1架构设计的一些优化:
真·插件式开发
:实现真正的插件式开发,每一个功能/业务模块都是独立的,可以独立生成种子数据和初始化表,不需要动其他项目。将批量修改和导入导出插件合并到system层
:这两个插件本应都是系统层的功能,之前分出来是觉得好维护,后来发现分的太细了还是合到system层好点。Cache和SqlSugar插件移除改为架构核心
:理论上Cache和Sqlsugar不能算插件,而是系统基础于是就移到了架构核心
模块。
二、项目结构
2.1的项目结构项目和2.0没啥太大变化,只是调整了项目位置和项目分层。
三、分层说明
3.1 架构核心
SimpleAdmin.Core->核心层
核心层,公共组件,常量,枚举,通用方法等其他核心代码,可以被任何项目引用,不依赖其他项目。
│ Core.Development.json --> 开发环境配置
│ Core.Production.json --> 生产环境配置
│ Startup.cs --> 启动类
├─Attributes --> 特性
├─BaseInput --> 共用输入参数(分页,ID传参等)
├─Components --> 公共组件
├─Const --> 常量
├─Dto --> 数据类
├─Enum --> 枚举类
├─Extension --> 拓展
├─Options --> 配置转实体选项
├─UnifyResult --> 统一返回结果
└─Utils --> 工具类(验证码,图片处理,种子数据处理等)
SimpleAdmin.Cache->缓存层
缓存层,系统核心之一,用来存储用户信息和认证信息和一些常用的数据库数据,支持MemeryCache
和Redis
│ Cache.Development.json --> 开发环境配置
│ Cache.Production.json --> 生产环境配置
│ Startup.cs --> 启动类
├─Const --> 常量
├─Inerface --> 接口
├─Options --> 配置转实体选项
├─Service --> 实现接口的服务类,分别是memerycache和redis的实现
SimpleAdmin.SqlSugar->ORM层
ORM层基于SqlSugar单例模块和仓储模式,将之前的CodeFirst集成到了该层。
│ SqlSugar.Development.json --> 开发环境配置
│ SqlSugar.Production.json --> 生产环境配置
│ Startup.cs --> 启动类
├─Const --> 常量
├─Db --> SqlSugar配置
├─Dto --> 数据类
├─Entity --> 实体
├─Extension --> 拓展
└─Utils --> 工具类(CodeFirst,种子数据处理等)
3.2 系统插件
3.2.1 核心插件
核心插件通常放置一些系统通用插件.
SimpleAdmin.Core>插件核心
├─Enum --> 枚举
├─Interface --> 接口
├─Options --> 配置转实体类
SimpleAdmin.Aop>Aop插件
实现Aop功能的插件,具体使用看Furion文档
├─Aop --> Aop实现类
├─Attributes --> Aop特性
3.2.2 系统模块插件
系统模块插件主要是对应的我们SimpleAdmin.System
层所用到的插件。
SimpleAdmin.Gen>代码生成器插件
实现系统代码生成功能
│ Gen.Development.json --> 开发环境配置
│ Gen.Production.json --> 生产环境配置
│ Startup.cs --> 启动类
├─Const --> 常量
├─Controllers --> 控制器
├─Entity --> 实体
├─Options --> 配置转实体
└─SeedData --> 种子数据
└─Services --> 服务类
SimpleAdmin.Mqtt>Mqtt插件
实现mqtt通信功能
│ Mqtt.Development.json --> 开发环境配置
│ Mqtt.Production.json --> 生产环境配置
│ MqttComponent.cs --> 组件类
├─Const --> 常量
├─Controllers --> 控制器
└─Services --> 服务类
SimpleAdmin.SignalR>SignalR插件
实现Signalr及时通讯功能
│ SignalRComponent.cs --> 组件类
├─Hub --> Hub类
├─Provider --> ID提供全
└─Service --> 服务类
3.3 业务模块
SimpleAdmin.System->系统应用层
系统应用层,主要是提供系统应用服务给Api接口层调用,SimpleAdmin的主要功能都由该层实现。
│ Startup.cs --> 启动类
│ System.Development.json --> 开发环境配置
│ System.Production.json --> 生产环境配置
├─Attributes --> 特性
├─Entity --> 实体
├─EventSubscriber --> 事件总线
├─ExtJson --> 实体中的ExtJson
├─Options --> 配置转实体类
├─Oss --> 对象存储
├─Services --> 服务(系统功能接口加实现)
└─UserManager --> 用户中心(获取当前请求用户信息)
SimpleAdmin.Application->业务应用层
业务应用层,主要是业务代码的编写,可以将自己的业务写在该层,当然也可以自己新建一层写。本系统该层主要是用作数据权限示例。
│ Application.Development.json --> 开发环境配置
│ Application.Production.json --> 生产环境配置
│ Startup.cs --> 启动类
│ Options --> 配置项转实体
└─Services --> 服务(业务功能实现)
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 --> 数据转换类
四、总结
2.1的架构是2.0的优化版本,实现了真插件式开发,以后需要哪个业务模块直接引用就行了,为后面移动端模块打下了基础,简直Nice
.