一、说明

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

  1. 插件式开发:分层明确,减少代码耦合性,增强代码可读性,避免项目成为屎山。
  2. Signalr和Mqtt并存:将Mqtt和Signalr都封装成插件使用,想要使用哪个就引用那个插件,并且支持同时引用。
  3. 支持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的更多相关文章

  1. 【手摸手,带你搭建前后端分离商城系统】02 VUE-CLI 脚手架生成基本项目,axios配置请求、解决跨域问题

    [手摸手,带你搭建前后端分离商城系统]02 VUE-CLI 脚手架生成基本项目,axios配置请求.解决跨域问题. 回顾一下上一节我们学习到的内容.已经将一个 usm_admin 后台用户 表的基本增 ...

  2. 【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)

    前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不 ...

  3. 【手摸手,带你搭建前后端分离商城系统】01 搭建基本代码框架、生成一个基本API

    [手摸手,带你搭建前后端分离商城系统]01 搭建基本代码框架.生成一个基本API 通过本教程的学习,将带你从零搭建一个商城系统. 当然,这个商城涵盖了很多流行的知识点和技术核心 我可以学习到什么? S ...

  4. 【转】手摸手,带你用vue撸后台 系列二(登录权限篇)

    前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自己是一个业务猿,每天被我司的产品虐的死去活来,之前又病了一下休息了几天,大家见谅. 进入正题,做后台项目区别于做其它的项目,权限验证与安全性是非常 ...

  5. 【转】手摸手,带你用vue撸后台 系列三(实战篇)

    前言 在前面两篇文章中已经把基础工作环境构建完成,也已经把后台核心的登录和权限完成了,现在手摸手,一起进入实操. Element 去年十月份开始用vue做管理后台的时候毫不犹豫的就选择了Elemen, ...

  6. 【转】手摸手,带你用vue撸后台 系列一

    前言 说好的教程终于来了,第一篇文章主要来说一说在开始写业务代码前的一些准备工作吧,但这里不会教你webpack的基础配置,热更新怎么做,webpack速度优化等等,有需求的请自行google. 目录 ...

  7. 手摸手教你让Laravel开发Api更得心应手

    https://www.guaosi.com/2019/02/26/laravel-api-initialization-preparation/ 1. 起因 随着前后端完全分离,PHP也基本告别了v ...

  8. 手摸手教你使用vue-cli脚手架-详细步骤图文解析[vue入门]

    写在前面: 使用 vue-cli 可以快速创建 vue 项目,vue-cli很好用,但是在最初搭建环境安装vue-cli及相关内容的时候,对一些人来说是很头疼的一件事情,本人在搭建vue-cli的项目 ...

  9. YApi——手摸手,带你在Win10环境下安装YApi可视化接口管理平台

    手摸手,带你在Win10环境下安装YApi可视化接口管理平台 YApi YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建 ...

  10. 手摸手带你用Hexo撸博客(二)之配置主题

    在上一篇博客手摸手带你用Hexo撸博客(一)中主要介绍了博客的初步搭建 今天我们继续讲如何在Hexo搭建的博客中应用主题 官网选择自己喜欢的主题 点击这里Hexo主题进入官网主题页面 然后选择自己喜欢 ...

随机推荐

  1. [自用初学]c++值传递和引用传递/ *&/ string

    https://baijiahao.baidu.com/s?id=1702573193376441989&wfr=spider&for=pc 总结: 1.函数参数传递主要分为值传递和& ...

  2. 20200926--图像旋转(奥赛一本通P96 9 多维数组)

    输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入:第1行包含两个整数n和m(1<=n<=100,1<=m<=100),表示图像包含像素点的行数和列数. 接下来n行 ...

  3. linux 命令下载文件

    系统  ubuntu  :若提示没有找到命令 请自行下截安装 sz 命令发送文件到本地:# sz filename rz命令本地上传文件到服务器:# rz执行该命令后,在弹出框中选择要上传的文件即可.

  4. Vivado中综合,实现,编程和调试工程可能会出现的问题及解决方案

    Xilinx公司的IDE(集成开发环境) Vivado用处广泛,学会使用Vivado对FPGA的学习至关重要,这里以PRX100-D开发板为例,对Vivado的学习使用进行探讨.本文将会持续更新,列出 ...

  5. 第一次作业:https://edu.cnblogs.com/campus/qdu/DS2020/homework/11165

    大家好,我是信息与计算科学一班的刘宝龙.爱好是看动漫,玩游戏,听音乐,不喜欢户外运动,是一个二次元宅男.但是喜欢交朋友,希望能与班里所有的同学建立良好的同学关系. 自己的强项是与人的交流与沟通,还有遇 ...

  6. 11、jmeter配置元件--计数器

    前面学过csv和变量 csv里面的数据是固定的  如果里面的数据不够  线程要么就停止要么就需要重头再来 不太灵活 用到固定化的数据,比如说多少个用户等等 如果有一些是变动的 随着线程数增加   数据 ...

  7. Learning under Concept Drift: A Review 概念漂移综述论文阅读

    首先这是2018年一篇关于概念漂移综述的论文[1]. 最新的研究内容包括 (1)在非结构化和噪声数据集中怎么准确的检测概念漂移.how to accurately detect concept dri ...

  8. Java使用Redis实现分布式锁

    1.概述 此处使用Redis的setNx命令和expire命令和del命令来实现分布式锁. 首先我们要知道, 我们的redis执行命令是队列方式的,并不存在多个命令同时运行,所有命令都是串行的访问.那 ...

  9. Docker 容器的备份和迁移

    Docker的Save和Export的区别 Docker的镜像和容器有两种方式导出 Docker Save镜像方法,会保存该镜像的所有历史记录,包括数据 1.创建快照 使用 docker commit ...

  10. app 好用的手机端开发调试工具插件 vconsole vue3

    效果:可以在手机上看控制台的内容 $ npm install vconsole 在main.js里引入 // 添加移动端log查看调试器 import Vconsole from 'vconsole' ...