SimpleAdmin手摸手教学之:项目架构设计2.0

一、说明

在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,多了一个插件层。

如图所示:

SimpleAdmin手摸手教学之:项目架构设计2.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们一起进步。

原文链接:https://www.cnblogs.com/huguodong/p/17287979.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SimpleAdmin手摸手教学之:项目架构设计2.0 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Asp.Net Core中WebSocket绑定的方法详解

    Asp.Net Core中WebSocket绑定的方法详解 WebSocket是一种在Web应用程序中实现双向通信的协议。在Asp.Net Core中,我们可以使用WebSocket来实现实时通信。本攻略将介绍如何在Asp.Net Core中使用WebSocket,并提供两个示例说明。 WebSocket绑定的方法 在Asp.Net Core中,我们可以使用…

    C# 2023年5月17日
    00
  • .net 像hao123的快捷邮箱登陆的实现代码

    首先,要实现像Hao123那样的快捷邮箱登录,我们需要了解一些前提知识和技术: Cookies:Cookie是一种由服务器发送到用户Web浏览器的小型文本文件,存储在用户计算机中,主要用于记录用户的登录状态、浏览记录等信息。 Session:Session是服务器端一种基于Cookie的数据存储技术,用于存储服务器和客户端之间的登录状态和其他数据。 .NET…

    C# 2023年5月31日
    00
  • Unity UI实现循环播放序列图

    一、前言 在Unity中,UI组件可以说是比较常用的一个功能,其中序列图也是一种非常常见的UI组件。本文主要解决循环播放序列图的问题,其中的技术方案就是使用Unity的UGUI来实现。 二、方案 实现循环播放序列图,可以参考以下步骤: 创建一个空的Image对象,命名为SequenceImage。 创建一个Sprite数组,用于存储序列图的所有帧。 创建一个…

    C# 2023年6月3日
    00
  • js内存泄露的几种情况详细探讨

    JS内存泄露的几种情况详细探讨 什么是内存泄露 内存泄漏指的是一个无用的对象仍然存在于内存中,因此该对象占用的内存无法被回收。在一个长时间运行的应用程序中,内存泄漏可能会导致内存耗尽并导致应用程序崩溃。 在JS中,有很多常见的情况会导致内存泄漏,下面将详细探讨几种情况。 几种常见的内存泄露情况 1. 意外的全局变量 意外的全局变量可能是最常见的内存泄漏场景。…

    C# 2023年6月7日
    00
  • 如何在.NET Core中为gRPC服务设计消息文件(Proto)

    在.NET Core中,使用gRPC框架可以轻松地创建跨平台的高性能微服务。在使用gRPC时,消息文件(Proto)的设计非常重要,因为它直接影响到服务的交互和数据格式。 下面是在.NET Core中为gRPC服务设计消息文件(Proto)的完整攻略: 1.安装gRPC工具 首先需要安装gRPC工具,可以通过以下命令安装: dotnet tool insta…

    C# 2023年6月3日
    00
  • C#编程简单实现生成PDF文档的方法示例

    综述 在C#编程中生成PDF文档是一项非常有用的功能。PDF文档可以在任何设备上展示并保留格式,因此它可以被广泛应用于数据报表、电子书等领域。本文将会详细讲述如何使用C#编程实现生成PDF文档的方法,同时提供两个实例来演示如何操作。 步骤 引入PDF库 在C#中生成PDF文档之前,需要下载和使用第三方PDF库。有很多开源的PDF生成库可以方便的使用,例如iT…

    C# 2023年6月1日
    00
  • C# winForm自定义弹出页面效果

    接下来我将详细讲解C# WinForm自定义弹出页面效果的完整攻略。我们可以通过以下步骤实现: 1. 创建自定义控件 首先,我们需要创建一个继承自Panel的自定义控件,并设置其BorderStyle为None,这样就可以去掉控件的边框。 public class CustomPanel : Panel { public CustomPanel() { th…

    C# 2023年5月15日
    00
  • C#如何自动选择出系统中最合适的IP地址

    为了选择系统中最合适的IP地址,我们可以使用C#编写程序使用以下步骤: 获取所有可用的网络接口信息 在C#中,我们可以使用NetworkInterface.GetAllNetworkInterfaces()方法获取当前系统中所有的网络接口信息,该方法会返回一个NetworkInterface类型的数组。 以下是一个获取网络接口信息的示例代码: using S…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部