.Net Core3.0 WebApi 项目框架搭建:目录
理论介绍
仓储(Respository)是存在于工作单元和数据库之间单独分离出来的一层,是对数据访问的封装。其优点:
1)业务层不需要知道它的具体实现,达到了分离关注点。
2)提高了对数据库访问的维护,对于仓储的改变并不会改变业务的逻辑,数据库可以用Sql Server(该系列博客使用)、MySql等。
基本项目架构
Common
公共组件层,存放一些公共的方法
Model
实体Model数据层,Enity文件夹中,存放的是整个项目的数据库表实体类,可以手动创建,当然也可以自动创建后面讲Sqlsugar会讲到。
VeiwModels文件夹,是存放的DTO实体类,在开发中,一般接口需要接收数据,返回数据,如果直接使用实体类返回的话弊端很大,不仅把重要信息暴露出去(比如手机号等),还对数据造成冗余(比如我需要接收用户的生日,还需要具体的年、月、日这就是三个字段,当然您也可以手动拆开,这只是一个栗子,所以不能直接用数据库实体类接收),就用到了DTO类的转换
最后的是MessageModel、TableModel和PageModel.,因为在前端接口中,需要固定的格式,以及操作,不能把数据直接发出去。
namespace Webapi.Core.Model { /// <summary> /// 通用返回信息类 /// </summary> public class MessageModel<T> { /// <summary> /// 状态码 /// </summary> public int status { get; set; } = 200; /// <summary> /// 操作是否成功 /// </summary> public bool success { get; set; } = false; /// <summary> /// 返回信息 /// </summary> public string msg { get; set; } = "服务器异常"; /// <summary> /// 返回数据集合 /// </summary> public T response { get; set; } } }
using System.Collections.Generic; namespace Webapi.Core.Model { /// <summary> /// 通用分页信息类 /// </summary> public class PageModel<T> { /// <summary> /// 当前页标 /// </summary> public int page { get; set; } = 1; /// <summary> /// 总页数 /// </summary> public int pageCount { get; set; } = 6; /// <summary> /// 数据总数 /// </summary> public int dataCount { get; set; } = 0; /// <summary> /// 每页大小 /// </summary> public int PageSize { set; get; } /// <summary> /// 返回数据 /// </summary> public List<T> data { get; set; } } }
using System.Collections.Generic; namespace Webapi.Core.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; } } }
IRepository和 Repository
仓储层:repository就是一个管理数据持久层的,它负责数据的CRUD(Create, Read, Update, Delete) service layer是业务逻辑层,它常常需要访问repository层。有网友这么说:Repository(仓储):协调领域和数据映射层,利用类似与集合的接口来访问领域对象。Repository 是一个独立的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository 是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。
我们定义了IRepository层,提供了所有的操作接口,这里简单定义一个测试接口
public interface ITestRepository { /// <summary> /// 求和 /// </summary> /// <param name="i"></param> /// <param name="j"></param> /// <returns></returns> int Sum(int i, int j); }
然后再在 TestRepository.cs 中去实现该接口,记得要添加引用。
public class TestRepository : ITestRepository { public int Sum(int i, int j) { return i + j; } }
IServices和 Service
业务逻辑层,就是和我们平时使用的三层架构中的BLL层很相似。Service层只负责将Repository仓储层的数据进行调用,至于如何是与数据库交互的,它不去管,这样就可以达到一定程度上的解耦,假如以后数据库要换,比如MySql,那Service层就完全不需要修改即可。
这里在 ITestService 中添加接口
public interface ITestService { /// <summary> /// 求和 /// </summary> /// <param name="i"></param> /// <param name="j"></param> /// <returns></returns> int Sum(int i, int j); } }
然后再在 TestService 中去实现该接口
public class TestServic : ITestService { ITestRepository test = new TestRepository(); public int Sum(int i, int j) { return test.Sum(i, j); } }
创建 Controller 接口调用
新建一个Test控制器
新建Sum接口
using Microsoft.AspNetCore.Mvc; using Webapi.Core.IService; using Webapi.Core.Service; namespace Webapi.Core.Controllers { public class TestController : BaseController { /// <summary> /// 求和 /// </summary> /// <param name="i"></param> /// <param name="j"></param> /// <returns></returns> [HttpGet] public int Sum(int i, int j) { ITestService testService = new TestService(); return testService.Sum(i, j); } } }
F5 运行项目,调试如下:
本章GitHub
https://github.com/huguodong/Webapi.Core/tree/Repository