【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
系列目录
一. 创建项目并集成swagger
三. 集成轻量级ORM框架——SqlSugar
本来打算将搭建项目架构和集成SqlSugar放在一起讲的,但是感觉东西有点多,还是分成两章吧~
这一章讲搭建项目的整体架构,这里先把搭建完成后的最终效果放出来,然后再逐个解释每层的作用。

可以看到这里一共有七层,源码在最下面,需要的可以下载源码进行对照。
下面我按照自顶层向底层的顺序介绍,所以和图片列出的顺序有点区别。
(一)RayPI 主项目层

我在控制器文件夹下添加了两个文件夹,Admin和Client,分别用来存放后台和前台的接口。
这么做主要有两个理由,一个是我觉得这样可以把后台和前台的功能、权限分的清楚些;
第二个是,后面我们要试着让我们的框架可以自动生成一些必备的代码,以减少重复的工作量。这些代码主要是增删改查的基础功能,我会将它们自动生成到admin里(毕竟对后台来说,每个实体都会涉及到增删改查,这是跑不了的)。
控制器层除了偶尔会做一些参数是否为空的验证外(有人认为验证也不应该在控制器层做,因人而异),其他不做任何操作,只是将参数传给下一层业务逻辑层处理。
所以除了接口的注释信息、接口路径、方法和权限等一些用于设置的代码外,这一层就不应该有其他任何乱糟糟的代码了~
(二)RayPI.Bussiness 业务逻辑层

我在业务逻辑层也就分成了Admin和Client两块,分别用来处理前后台的业务逻辑。该层只做业务逻辑的相关运算,不会对数据库进行任何直接的操作。
业务逻辑层接收到控制器层传递的参数后,将这些参数做相应的处理,然后将加工后的参数传给下一层:数据接口层。(按照比较简单的三层架构思想,其实应该直接传给数据层,但是这里利用数据接口层做了一个分隔,好处后面慢慢就会发现了)
(三)RayPI.IService 数据接口层

该层为数据接口层,里面只罗列了相应的接口函数,但是具体的函数功能实现则交给继承该数据接口的数据层来实现。
这样做的好处是可以将数据库操作与代码逻辑操作分离的更加清晰。
不论是编写代码还是阅读代码,我们在操作业务逻辑层时只需要知道我们调用的数据接口的功能即可,但是这个功能的具体实现则暂时不需要考虑;
当我们编写或阅读数据层时,只需要考虑是否实现了继承的数据接口的功能,而不需要再往上去看业务逻辑层。
(四)RayPI.Service 数据层

该层负责直接或者间接对数据库进行操作,如果你是用原生的或者类似Dapper的数据库中间件,那么在这一层就会看到相应的sql语句(当然,这里我们选择了集成SqlSugar作为数据库操作中间件,下一章讲)。
该层继承了相应的数据接口,所以必须实现接口内的所有函数。
图片上可以看到它还继承了一个类,叫BaseDB,这个类是我自己添加的帮助类,在待会儿要讲的Model层里,类里只有一个函数叫GetClient(),用来返回SqlSugarClient类(这个是SqlSugar集成的类,下一章具体讲)。
(五)RayPI.Entity 实体层

该层为实体类层,存储了数据库对应的所有实体,实体一般和数据库表是一一对应的。
(六)RayPI.Model 模型层

该层存放了一些系统帮助类,或是实体辅助类。
BaseDB用于返回SqlSugar的SqlSugarClient类,数据层一般直接继承该类。
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace RayPI.Model
{
public class BaseDB
{
public static SqlSugarClient GetClient()
{
SqlSugarClient db = new SqlSugarClient(
new ConnectionConfig()
{
ConnectionString = BaseDBConfig.ConnectionString,
DbType = DbType.SqlServer,
IsAutoCloseConnection = true
}
);
db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
};
return db;
}
}
}
BaseDB类
BaseDBConfig用于存放数据库的配置信息,比如数据库连接字符串(这些配置信息还可以分离出来,存放到主项目的json文件中,以供读写,这个后面提出一章专门讲)。
namespace RayPI.Model
{
public class BaseDBConfig
{
public static string ConnectionString = "server=.;uid=sa;pwd=Admin;database=RayPI";
}
}
BaseDBConfig
MessageModel是一个泛型的返回类,用于格式化的向接口返回数据。
using System;
using System.Collections.Generic;
using System.Text; namespace RayPI.Model
{
/// <summary>
/// 通用返回信息类
/// </summary>
public class MessageModel<T>
{
/// <summary>
/// 操作是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 返回信息
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 返回数据集合
/// </summary>
public List<T> Data { get; set; } }
}
MessageModel
TableModel也是一个返回类,用于格式化的向接口返回列表格式的数据。
using System;
using System.Collections.Generic;
using System.Text; namespace RayPI.Model
{
/// <summary>
/// 表格数据,支持分页
/// </summary>
public class TableModel<T>
{
/// <summary>
/// 返回编码
/// </summary>
public int Code { get; set; }
/// <summary>
/// 返回信息
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 记录总数
/// </summary>
public int Count { get; set; }
/// <summary>
/// 返回数据集
/// </summary>
public List<T> Data { get; set; }
}
}
TableModel
(七)SqlSugar层

这一层并不是搭建出来的,而是从github引用的源码。
SqlSugar是一个开源的ORM框架,可以实现度数据库灵活方便的操作。如果你选择不引用源码,而是利用Nuget导包的方式向项目引入,那么项目里就没有这一层。
关于引入并配置SqlSugar下一章再讲~
具体可以参考下面的源码
源码下载地址:点击获取下载地址
到目前为止,项目架构相比第一章已经有点模样了。
下一章我们就开始讲继承“轻量级”的ORM框架——SqlSugar,并且利用它实战地编写一个简单完整的接口。
【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构的更多相关文章
- 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(一)创建项目并集成swagger:1.1 创建
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.1 搭建环境
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(五)由浅入深详解CORS跨域机制并快速实现
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 从零开始搭建自己的.NET Core Api框架-1目录
https://www.cnblogs.com/RayWang/p/9216820.html 系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. ...
- 从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目
原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...
- 基于.Net Core的API框架的搭建(1)
目标 我们的目标是要搭建一个API控制器的项目,API控制器提供业务服务. 一.开发框架搭建 1.开发前准备 开发前,我们需要下载如下软件,安装过程略: (1) 开发工具:VS2017 (2) 数据库 ...
随机推荐
- hadoop mkdir: Cannot create directory /usr. Name node is in safe mode.
今天在hdfs上面创建文件夹的时候报了:org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name ...
- Hadoop第一式:配置Linux环境之免密配置及SSH原理
一.配置SSH免密登录 进入/.ssh目录,执行密钥生成指令 ssh-keygen -t rsa (rsa为默认加密格式) 然后会出现四个提示,让你选择密钥保存路径.指纹.拍照啥的,不用管它直接回车过 ...
- Java线段树
线段树不是完全二叉树,是平衡二叉树 堆也是平衡二叉树 堆满二叉树: h层,一共有2^h-1个节点(大约是2^h) 最后一层(h-1层)有2^(h-1)个节点 最后一层的节点数大致等于前面所有层节点之和 ...
- [原创]SecureCRT终端软件连接VMware Workstation Pro虚拟机
Step1:检查主机的桥接有没有禁用 Step2:进入Ubuntu系统,进入到Ubuntu下,先查看Ubuntu虚拟机的IP配置,打开终端(Ctrl+Alt+T),通过ifconfig命令查看,可以看 ...
- eclipse 开发环境问题
1.jdk安装,环境变量设置.主要有两个: JAVA_HOME C:\Program Files\Java\jre7 JRE_HOME C:\Program Files\Java\jre7 2 ...
- 禁止Centos7系统yum自动下载更新
安装Centos7后,系统自动更新状态默认为开启,若禁止系统自动更新需要手动关闭. 1.进入yum目录 [root@localhost ~]$ cd /etc/yum 2.编辑yum-cron.co ...
- 神器PHPStorm个人最常用快捷键
PHPStorm是目前PHP开发者最常用的IDE之一,善用快捷键可以极大地提升效率,网上有很多盘点,多而全,但很多要么不实用,要么操作不方便,下面盘点一下个人平时最常用的,亲测有效. CTRL+N 查 ...
- Spark 常规性能调优
1. 常规性能调优 一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性 ...
- AT与ATX电源 - 1 系统状态
ATX与AT电源比较 ATX电源普遍应用在PC中,它有两套电源,一个是正常操作使用:12V,5V,3.3V和-12V,还有一个独立的5V待机电源,所谓的待机电源就是其ON的充要条件是AC输入存在,而正 ...
- 在dcef3当中执行js代码并获得返回值
1.如何在dcef3当中执行js代码 procedure TForm1.btnWriteZMClick(Sender: TObject);var js: string;begin js := 'd ...