首页 > 其他分享 >SimpleAdmin系统教程之:项目架构设计

SimpleAdmin系统教程之:项目架构设计

时间:2023-01-06 10:47:31浏览次数:42  
标签:架构设计 教程 Web SimpleAdmin 接口 -- json API

一、说明

本章主要介绍的是SimpleAdmin后端架构设计,作为一个系统的基石,一个好的架构设计可以让开发者在开发中少走很多弯路。在写SimpleAdmin这个系统之前,也用过一些其他的admin系统,某些虽然看起来非常简单方便,开发效率非常高,但是在实际开发中发现并不是那么回事,项目分层不清晰导致依赖严重,耦合度过高,为了图方便将API和Service写在一起,只能在当前系统中添加功能,如果想拓展一个api项目或者workservice项目做其他服务,非常麻烦。本人虽然不是架构师,但是通过汲取开发过程中的一些经验,加上站在Furion这个巨人的肩膀上,根据Furion脚手架设计了这么一个项目架构,设计目的就是简单,高效,易扩展,利于二次开发,如果有更好的设计,欢迎提出和探讨。

二、项目结构

整体项目结构分为6层,基本结构如下。

  • SimpleAdmin.Application:业务应用层(业务代码主要编写层)
  • SimpleAdmin.Background:后台服务层(用作定时任务等非web服务)
  • SimpleAdmin.Core:核心层(实体,公共组件,常量,枚举等其他核心代码)
  • SimpleAdmin.System:系统应用层 (系统功能代码层)
  • SimpleAdmin.Web.Core:WebApi接口层(存放 Web 公共代码,如 过滤器、中间件、Web Helpers 等)
  • SimpleAdmin.Web.Entry: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 --> 存放控制器
│  ├─Application  --> 业务功能控制器
│  └─System  --> 系统功能控制器
├─Filter  --> 过滤器
├─Handlers  -->  处理器
└─Logging  -->  操作日志功能

SimpleAdmin.System->系统应用层

系统应用层,主要是提供系统应用服务给Api接口层调用,SimpleAdmin的主要功能都由该层实现。

│  Startup.cs  --> 启动类
│  System.Development.json  -->  开发环境配置
│  System.Production.json  -->  生产环境配置
├─EventSubscriber  -->  事件总线
├─Oss  -->  对象存储
├─SeedData  -->  种子数据
├─Services  -->  服务(系统功能接口加实现)
├─SignalR  -->  即时通讯
└─UserManager  -->  用户中心(获取当前请求用户信息)

SimpleAdmin.Core->核心层

核心层,存放实体,公共组件,常量,枚举等其他核心代码,可以被任何项目引用,真正做到了无依赖。

│  Core.Development.json  -->  开发环境配置
│  Core.Production.json  -->  生产环境配置
│  Startup.cs  -->  启动类
├─Aop  -->  Aop功能
├─Attributes  -->  特性
├─BaseInput  -->  共用输入参数(分页,ID传参等)
├─Components  -->  公共组件
├─Const  -->  常量
├─Dto  -->  数据类
├─Entity  -->  数据库实体
├─Extension  -->  拓展
├─ExtJson  -->  数据库ExtJson字段对应实体
├─Options  -->  配置文件转实体
├─Sqlsugar  -->  ORM配置
├─UnifyResult  -->  统一返回结果
└─Utils  -->  工具类(验证码,图片处理,种子数据处理等)

SimpleAdmin.Background->后台服务层

后台服务层,作为定时任务,MQTT或其他服务载体常驻于后台,不依赖于Web,不会因web服务升级而停止。这样做的好处就是不会被iis内存回收,也不会因为web服务升级而停止工作。

│  Background.Development.json  --> 开发环境配置
│  Background.Production.json  --> 生产环境配置
│  MqttWorker.cs  --> mqtt后台任务
│  Program.cs  -->  启动类
├─Dto  -->  数据转换类

SimpleAdmin.Application->业务应用层

业务应用层,主要是业务代码的编写,可以将自己的业务写在该层,当然也可以自己新建一层写。本系统该层主要是用作数据权限示例。

│  Application.Development.json  --> 开发环境配置
│  Application.Production.json  --> 生产环境配置
│  Startup.cs  --> 启动类
└─Service  --> 服务(业务功能实现)

四、关于有动态API为什么还要控制器

答案只有一个,那就是解耦。Furion的动态API确实非常的方便,可以将Service类直接转换为Api接口类,在小项目开发中确实很方便,但是随着本人在实际工作中的使用,发现这种方式有着非常多的弊端,而且在Furion脚手架中,虽然也用了动态API,但是也是和service是分开的,说明API和Sevice还是不能混在一起,下面我会详细说说分开的好处。

4.1 解决臃肿问题

在动态API中,一个方法代表一个API接口,所有的方法都在一个类中,如果我有多个接口调用的都是一个方法,只是其中一个方法的参数不一样,那么我就要在Service中写多个接口类和一个方法类,这就导致在一个类中,我有N个方法,有点大杂烩的感觉。如果我们将动态api和service分离开来,那么代码结构就非常清晰,不管我在控制器类中写多少个接口,都有可能指向一个方法,也可能指向不通的Service类的不同方法,能很直观的知道某个接口引用的哪个服务的哪个方法。可能开发前期看不出来,但是随着工程越来越大,功能越来越多,将服务和动态API分离的好处越明显。

4.2 更好的实现仓储

本系统采用的是Sqlsugar单例模式+仓储模式开发,实现仓储非常简单,只需要在服务类继承仓储类即可。

public class ConfigService : DbRepository<DevConfig>, IConfigService

如果将该类继承动态API接口IDynamicApiController,该服务的基类也就是仓储类也会被Swagger解析,导致解析失败,启动报错,虽然可以通过在构造函数中引入仓储,但是还是那句话,动态API做API的事,服务做服务的事。如果这个例子不能很好的证明分开的必要,那么下面这个场景会很好的解释为什么要分开。

4.2 更好的拓展

假设我们现在是API和Service未分离的模式,并且系统已经开发完毕,现有以下业务场景:在当前系统的基础上增加一个OpenAPI开放接口平台,开放系统中的部分接口供第三方调用,第三方通过系统分配的ApiKey和ApiSercet获取token,然后携带token访问接口。

根据上述业务场景,设计思路为:新建WebApi项目->引用接口对应服务所在层 ,只需在新的web项目中增加鉴权操作返回token,然后对方直接调用对应的接口就行。但是就在我们新建了一个API项目并引用了服务层之后,就会发现一个大问题:所有的接口的引入过来了,因为现在是API和Service未分离的模式,我只要引用了Service,那么所有的接口都会暴露出来,然而需求是只开放部分接口,这可如何是好,通过furion的隐藏api接口功能?那么原来系统的中的接口也将隐藏掉,有点自欺欺人了。还有一个问题,接口路由地址也改不了,比如原来我的接口地址是 api/a/b ,现在我的开放平台要换成 api/c/b 。看来想要实现以上需求,只有一个办法->

如果采用控制器和服务分离的模式,则不会有这种问题。直接新建API项目。

引用System层。

引用furion。

启动项目,默认浏览器应该是localhost:5133/weatherforecast,直接删除weatherforecast然后回车,可以看到swagger已经启动,并且只有一个系统内置接口。

那么想要实现调用Serivce层方法,也非常简单,只需要创建一个控制器,然后注入想要的服务,调用方法就行。

    /// <summary>
    /// 测试控制器
    /// </summary>
    [ApiDescriptionSettings(Tag = "测试接口")]
    [Route("api/[controller]")]
    public class TestController
    {

        private readonly ISysUserService _sysUserService;

        public TestController(ISysUserService sysUserService)
        {
            this._sysUserService = sysUserService;
        }

        /// <summary>
        /// 用户分页查询
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("page")]
        public async Task<dynamic> Page([FromQuery] UserPageInput input)
        {
            return await _sysUserService.Page(input);
        }

    }

通过swagger可以看到已经新增了一个接口,并且可以成功调用。

接下来,想开放哪个接口就直接在控制器里加就行了,是不是非常的方便,虽然相比API和Service在一起的模式多写了一些代码,但是对于项目的可拓展性有了很大的提示,这也是为什么要API和Service分离的原因。

标签:架构设计,教程,Web,SimpleAdmin,接口,--,json,API
From: https://www.cnblogs.com/huguodong/p/17027978.html

相关文章

  • 物联网移动APP架构设计
    Android系统架构应用层SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等。这些应用程序都是用Java语言编写的,并且都是可以被开发人员开发的其他应用程序所替换应......
  • go语言学习教程
    go语言学习教程集合了连接goroutine、go连接redis、go连接kafka等示例https://github.com/fastbpmn/go-studyTRANSLATEwithxEnglishArabicHebrewPol......
  • 最新go语言学习教程
    go语言学习教程集合了连接goroutine、go连接redis、go连接kafka等示例,所有代码均经过实践,可以直接使用https://github.com/fastbpmn/go-studyTRANSLATEwithxE......
  • 8个jQuery Mobile基础教程
    1. ​​jQueryMobile入门介绍​​  2. ​​jQueryMobile基本教程​​  3. ​​jQueryMobile开发简单应用​​  4. ​​jQueryMobile高级教程-RSS阅读器应......
  • Python 异步:完整教程
    Asyncio允许我们在Python中使用基于协程的并发异步编程。尽管asyncio已经在Python中使用多年,但它仍然是Python中最有趣但最令人沮丧的领域之一。对于新开发人员来......
  • PS新手教程-如何使用PS快速调出海边清丽人像照片教程
    如何使用PS快速调出海边清丽人像照片教程?给大家介绍如何使用PS快速调出海边清丽人像照片教程,一起来看看吧。1.打开PS,导入素材,选取颜色工具,减去照片中的黄色。2.再调整红色数......
  • php+vscode+nginx+Xdebug 安装教程(vscode用debug的调试php)
    环境:window10+ phpstudy+vscode php全篇用php8.0.2,也可以用其他的版本,但要注意所有配置路径都要统一版本一、环境变量将你正在使用的php加入环境变量。因为phpstudy......
  • burpsuite使用教程(二)
    之前介绍过burpsuite的各个模块​今天具体的来讲解一下proxy这个模块​Proxy——是一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,......
  • 【教程】批量删除“._”开头文件
    ✨“._”开头文件从macOS使用U盘或者是移动硬盘向Windows迁移文件时在Windows下会有许多“._”开头文件其中每个目录都包含.DS_Store文件DS_Store,英文全称是Deskto......
  • Genome2D官方博客及教程
     Genome2D作者博客:​​http://blog.flash-core.com/​​日本的教程:​​http://www.project-nya.jp/modules/weblog/details.php?blog_id=1739​​Genome2D社区活跃成员......