【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构

系列目录

.  创建项目并集成swagger

  1.1 创建

  1.2 完善

二. 搭建项目整体架构

三. 集成轻量级ORM框架——SqlSugar

  3.1 搭建环境

  3.2 实战篇:利用SqlSugar快速实现CRUD

  3.3 生成实体类

四. 集成JWT授权验证

 


 

 

本来打算将搭建项目架构和集成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,并且利用它实战地编写一个简单完整的接口。

转载于:https://www.cnblogs.com/RayWang/p/9221484.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zk 布局_ZK实际应用:样式和布局

zk 布局在先前的ZK in Action帖子中&#xff0c;我们使用ZK MVVM实现了CRUD功能 。 我们还快速浏览了一些样式代码&#xff0c;可能需要更多的解释。 在本文中&#xff0c;我们将介绍如何在ZK小部件上附加新CSS样式规则&#xff0c;以及如何覆盖现有样式。 我们还将介绍ZK中UI布…

蓝桥杯 2011年第二届C语言初赛试题(2)

6. 代码填空 &#xff08;满分9分&#xff09; 中奖计算 某抽奖活动的规则是&#xff1a;每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同&#xff0c;则称为中了几个号。 例如&…

MATLAB离散一维小波函数

waveinfowfilters(wname);appcoef近似系数 detcoef详细系数dwt 单层独立1-D小波idwtupcoef 线性重建upwlev 单层重建wavedec wavelet decompositionwaverecwrcoef

使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分

在这一系列博客文章中&#xff0c;我们将使用以下技术堆栈构建完整的响应式Web应用程序&#xff1a; 1&#xff09;弹簧靴 – Spring MVC网站 – Spring Data JPA –Spring安全 2&#xff09;Thymeleaf用于服务器端模板 3&#xff09;客户端MVC的Angular JS&#xff08;包括…

Codeforces 999F Cards and Joy 【dp】【性质】

读完这道题后应该想到牌有多少张都是什么不重要&#xff0c;重要的是player的favorite number是怎么分配的。&#xff08;因为不是任何player的favorite number不能带来任何joy&#xff09;然后每个favorite number带来的joy互相不受影响&#xff0c;因为如果favorite number不…

蓝桥杯 2011年第二届C语言初赛试题(3)

1、假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次&#xff08;数目加倍&#xff09;&#xff0c;Y出生后每隔2分钟分裂一次&#xff08;数目加倍&#xff09;。 一个新出生的X&#xff0c;半分钟之后吃掉1个Y&#xff0c;并且&#xff0c;从此开始&#xff0c…

MATLAB凸包Convex hull运算

凸包Convex hull运算&#xff08;求离散点的边界&#xff09; [k,a] convhull(x,y); K convulln(X, options);[K AV] convexHull(DT);tsearch :搜索Delaunay三角形delaunay :Delaunay三角化dsearch :求最近点 (这是两个有趣的函数)inpolygon :搜索多边形…

MATLAB Floyd算法

Floyd算法 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。 核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] nn开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(…

父组件 子组件渲染

子组件使用v-if判断后渲染。 v-if 也是惰性的&#xff1a;如果在初始渲染时条件为假&#xff0c;则什么也不做——直到条件第一次变为真时&#xff0c;才会开始渲染条件块。 转载于:https://www.cnblogs.com/mengfangui/p/9228137.html

介绍Spring Integration

在本文中&#xff0c;我们介绍Spring Integration 。 如果您以前没有使用过Spring Integration&#xff0c;那么可能会帮助您复习Gregor Hohpe的Enterprise Integration Patterns 。 我还将推荐Josh Long 撰写的这篇出色的介绍性文章 。 上下文设置 简而言之&#xff0c; 企业…

蓝桥杯 2011年第二届C语言初赛试题(4)

4、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪&#xff1a; 每位选手需要回答10个问题&#xff08;其编号为1到10&#xff09;&#xff0c;越后面越有难度。答对的&#xff0c;当前分数翻倍&#xff1b;答错了则扣掉与题号相同的分数&#xff08;选手必须回答…

各种资源(持续更新中)

寻找网页设计灵感的27个最佳网站推荐http://www.cnblogs.com/lhb25/archive/2011/04/19/2014303.html 模板王http://www.mobanwang.com/ http://sc.chinaz.com/

Katy Perry - E.T.

作曲 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman 作词 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman Youre so hypnotizing // hypnotize /ˈhipnəˌtīz / v.催眠,捕捉全部注意力,吸引 Could you be the devil? 你可会是那魔鬼&#xf…

使用Gradle禁止Java和Spring Boot Web应用程序中的FindBugs警告

如何在 Spring Boot和 Java应用程序中使用注释抑制FindBugs警告 如果您的构建由于FindBugs问题而中断&#xff0c;并且是假阳性&#xff0c;或者由于其他考虑而无法解决问题&#xff0c;则可以添加注释来忽略Findbugs警告。 更新您的Gradle依赖关系 您将需要在build.gradle文…

true,false组合问题

题目&#xff1a;给定n个布尔变量x1,x2,x3…xn&#xff0c;希望输出所有可能的布尔变量组合。例如当n&#xff1d;&#xff12;时&#xff0c;有&#xff14;种组合&#xff1a;a、true,true;b、true,faulse;c、faulse,true;d、faulse,faulse。请编写一个&#xff23;程序实现这…

更改matlab默认启动路径

1. 系统默认的启动路径是“我的文档”里的work目录&#xff0c;如果想要更改启动路径&#xff0c;解决方法是修改桌面上 MATLAB 快捷方式的属性&#xff0c;将原本的参数“目标” -sd 后面的 $documents\MATLAB 替换成自己的目录即可。我试了很多种方法&#xff0c;就这个最好使…

配置gitlab通过smtp发送邮件

https://www.centos.bz/2017/08/gitlab-send-email-with-smtp/ 1. 编辑/etc/gitlab/gitlab.rb文件&#xff08;加到文件最后面就好了&#xff09;。以QQ企业邮箱为例&#xff1a; gitlab_rails[smtp_enable] truegitlab_rails[smtp_address] "smtp.exmail.qq.com"g…

蓝桥杯 2011年第二届C语言初赛试题(5)

今盒子里有n个小球&#xff0c;A、B两人轮流从盒中取球&#xff0c;每个人都可以看到另一个人取了多少个&#xff0c;也可以看到盒中还剩下多少个&#xff0c;并且两人都很聪明&#xff0c;不会做出错误的判断。我们约定&#xff1a;每个人从盒子中取出的球的数目必须是&#x…

CUBA平台–用于快速应用程序开发的开源Java框架

传统上&#xff0c;自计算时代开始以来&#xff0c;企业软件开发自然面临着一个挑战&#xff0c;当时自然而然地&#xff0c;企业软件开发本应专注于解决实际的业务问题&#xff0c;但与此同时&#xff0c;开发人员必须在技术上花费大量时间和精力。解决方案的一面&#xff0c;…

C#与mongoDB初始环境搭建

mongoDB官网https://www.mongodb.com/ mongoDB默认安装路径(Windows x64平台) C:\Program Files\MongoDB\Server\3.4\bin mongoDB环境变量配置 启动mongoDB服务 > mongod -dbpath D:\mongodb > mongo Visual Studio引用mongoDB PM> install-package M…