一、前言

分层开发的思想在计算机领域中至关重要,从操作系统到软件设计,分层思想无处不在。

在搭建项目的分层结构前,先简单了解下分层的优缺点。如下图,分为(呈现层、业务层、服务层、数据层)

分层的优点:

1、层次分明,各司其职:每层都有各自的责任,各层级相互独立,上层不需要知道下层的内部实现,上层的改动不会影响下一层。

2、易于开发,便于调试:分层结构使得开发人员可以专注于谋一层进行开发,进行调试时,可以针对每一层进行单独调试。

3、促进标准,移植复用:可替换任意一层,如当前数据层读数据库,可替换为读文件数据,取网络数据。亦可移植到其他项目。

4、。。。。。。

分层的缺点:

1、降低性能:一个简单的数据呈现,需逐层返回且中间的数据转换等都耗费时间。

2、级联修改:在呈现层中增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

3、。。。。。。

二、WebAPI项目分层

简单了解了分层优缺点后,创建项目的分层结构

此处注意,这里为了规范项目名称,重新建了个Web API项目命名为MWebAPI(上篇文章项目名称为mweb-api)

各项目职责如下:

Action:用来分发来自客户端(PC、移动设备、浏览器)的请求;

Services:进行具体的业务处理;

IServices:Services的抽象;

Repository:先假想为数据访问层(实际上和数据访问层区别较大);

IRepository:Repository的抽象;

Entity:数据实体映射,通常从数据库映射而来;

Dto:数据传输对象,一般和前端页面相对应;

Utility:通用工具层,提供公用帮助类;

明确了各层的职责,下面创建一个简单的业务来贯穿各层。以获取用户信息为例

三、获取用户信息流程

四、用户信息各层实现

1、创建UserInfo实体类

在MEntity项目中新建 UserInfo实体类

public class UserInfo
{
public string UserName { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}

2、创建UserInfoDto传输对象

在MDto项目中新建 UserInfoDto

public class UserInfoDto
{
public string UserName { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}

问题:Dto有什么意义?

初略理解:在项目的初期,数据表字段与Controller返回的字段往往是一致的,如同上面的获取用户信息业务。此情形下,Dto无意义。

但当数据表中还有Password,TelPhone等信息但前端并不需要时,此时Dto只返回所需,避免传输整张表,一定程度上提高了项目的安全性。

3、创建仓储接口与仓储实现类

在MIRepository项目中新建IUserInfoRepository

public interface IUserInfoRepository
{
UserInfo GetUserInfo();
}

在MRepository项目中新建UserInfoRepository,目前项目并未连接数据库,故直接返回个实体类对象

public class UserInfoRepository : IUserInfoRepository
{
public UserInfo GetUserInfo()
{
return new UserInfo()
{
UserName = "王二麻子",
Age = 20,
Address = "那美克星",
};
}
}

4、创建服务接口与服务实现类

在MIServices项目中新建IUserInfoServices

public interface IUserInfoServices
{
UserInfoDto GetUserInfo();
}

在MIServices项目中新建UserInfoServices

public class UserInfoServices : IUserInfoServices
{
readonly IUserInfoRepository _rep = new UserInfoRepository();
public UserInfoDto GetUserInfo()
{
var entity = _rep.GetUserInfo();
UserInfoDto dto = new UserInfoDto { UserName = entity.UserName, Age = entity.Age, Address = entity.Address };
return dto;
}
}

5、创建Controller

在MWebAPI项目中新建UserInfoController

[ApiController]
[Route("[controller]/[action]")]
public class UserInfoController : Controller
{
private readonly IUserInfoServices _services = new UserInfoServices();
[HttpGet]
public UserInfoDto GetUserInfo()
{
return _services.GetUserInfo();
}
}

启动项目,浏览器输入:http://localhost:5000/UserInfo/GetUserInfo,数据返回成功。

五、服务注入

此时项目中UserInfoController的 _services 是new出来的,UserInfoServices 的_rep也是如此,目前比较流行的是使用依赖注入的方式去注入服务,下面我们改写Services及Controller,如下:

public class UserInfoServices : IUserInfoServices
{
private readonly IUserInfoRepository _rep;
public UserInfoServices(IUserInfoRepository rep)
{
_rep = rep;
}
public UserInfoDto GetUserInfo()
{
var entity = _rep.GetUserInfo();
UserInfoDto dto = new UserInfoDto { UserName = entity.UserName, Age = entity.Age, Address = entity.Address };
return dto;
}
}
public class UserInfoController : Controller
{
private readonly IUserInfoServices _services;
public UserInfoController(IUserInfoServices services)
{
_services = services;
} [HttpGet]
public UserInfoDto GetUserInfo()
{
return _services.GetUserInfo();
}
}

启动项目,浏览器输入:http://localhost:5000/UserInfo/GetUserInfo。

此时是因为未注入服务,在Startup类ConfigureServices方法中注入服务

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllers();
  services.AddScoped<IUserInfoRepository, UserInfoRepository>();
  services.AddScoped<IUserInfoServices, UserInfoServices>();
}

再次运行

六、结语

本篇文章中涉及了两个概念仓储模式与依赖注入(.Net Core 3.1浏览器后端服务(四) 你眼中的依赖注入与我相同吗?),目前并未深入的研究,将在后续的文章中挖掘。

Services和Repository均定义了相应的接口,一个好处是便于服务注入。这样做还有哪些好处?欢迎各位道友一起讨论!!!

.Net Core 3.1浏览器后端服务(二) Web API项目分层的更多相关文章

  1. .Net Core 3.1浏览器后端服务(一) Web API项目搭建

    一.前言 基于CefSharp开发的浏览器项目已有一段时间,考虑到后期数据维护需要Server端来管理,故开启新篇章搭建浏览器后端服务.该项目前期以梳理服务端知识为主,后期将配合CefSharp浏览器 ...

  2. .Net Core 3.1浏览器后端服务(三) Swagger引入与应用

    一.前言 前后端分离的软件开发方式已逐步成为互联网项目开发的业界标准,前后端分离带来了诸多好处的同时,也带来了一些弊端. 接口文档的维护就是其中之一,起初前后端约定文档规范,开发的很愉快,随着时间推移 ...

  3. .Net Core 3.1浏览器后端服务(五) 引入定时任务Quartz.Net

    一.前言 近期项目中遇到一些需求,需要定时写入数据库,定时刷新缓存的问题,因此需要引入任务调度机制. 我的选择是使用 Quartz.Net,使用的版本是 3.2.4 这里强调一点:3.x的版本与2.x ...

  4. .Net Core 3.1浏览器后端服务(四) 你眼中的依赖注入与我相同吗?

    一.前言 DI-Dependency Injection 依赖注入 IoC-Inversion of Control 控制反转 近几年这依赖注入. 控制反转已成为软件开发中不可或缺的一部分,那么该怎么 ...

  5. 从0到1手把手教你ASP.NET Core Web API项目配置接口文档Swagger(二)

    传送门:从0到1手把手教你ASP.NET Core Web API项目配置接口文档Swagger(一) 一.设置Swagger页面为首页--开发环境 我们虽然可以在输入 /swagger 后顺利的访问 ...

  6. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

    标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...

  7. 前端使用AngularJS的$resource,后端ASP.NET Web API,实现分页、过滤

    在上一篇中实现了增删改查,本篇实现分页和过滤. 本系列包括: 1.前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查2.前端使用AngularJS的$re ...

  8. 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查

    AngularJS中的$resource服务相比$http服务更适合与RESTful服务进行交互.本篇后端使用ASP.NET Web API, 前端使用$resource,实现增删改查. 本系列包括: ...

  9. 从0到1手把手教你ASP.NET Core Web API项目配置接口文档Swagger(一)

    一.创建ASP.NET Core Web API项目(若项目已创建,则可跳过本节内容) 1.双击打开VS2022. 2.单击"创建新项目",如下图. 3.选择"ASP.N ...

  10. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(4)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

随机推荐

  1. 共赴元宇宙新纪元,华为云VR开发应用大赛总决赛倒计时7天!

    摘要:"第三届华为云VR开发应用暨沈阳元宇宙开发应用大赛"总决赛即将于2月13日在沈阳市和平区揭幕. 由沈阳市和平区人民政府.华为技术有限公司共同主办的"第三届华为云VR ...

  2. CWE4.8:2022年危害最大的25种软件安全问题

    摘要:我们来看下新版的<2022年危害最大的25种安全问题>在安全预防上会给了我们哪些安全提示. 本文分享自华为云社区<CWE4.8 -- 2022年危害最大的25种软件安全问题&g ...

  3. 云图说 | 分布式缓存服务DCS—站在开源Redis前辈的肩膀上,扬帆起航

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:DCS基于开源Re ...

  4. 火山引擎ByteHouse:如何用OLAP引擎提升数字营销效果?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   随着市场竞争的加剧,企业对数字营销投入的效果监测和优化需求日益增强,营销实时监控也成为企业提升运营效率的重要手 ...

  5. Chrome浏览器导出HTTPS证书

    点证书小锁 进入证书界面 到详情中,导出证书

  6. Axure 变量、属性、函数

    局部变量 使用场景非常多; 需要先创建; 只能作用于当前事件; 命名需要注意,只能英文+数字; 全局变量 需要先创建; 可以作用于整个文档,在任意页面调用或使用 中继器的 Item 属性 item:获 ...

  7. 备份批处理文件 bat 生成 date 取年时,只取到周

    备份数据库文件时,发现MySQL备份生成的文件名为 [vipsoft_周三],发现是系统的日期格式问题.需调整日期格式,生成 [vipsoft_20220601.sql] mysqldump -uro ...

  8. HTML5 postMessage 跨域跨窗口传递消息

    父页面代码: <!DOCTYPE html> <html> <head> <title>选择位置demo</title> <meta ...

  9. L2-012 关于堆的判断 (25分) (字符串處理)

    将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y are siblings:x和y是兄弟结 ...

  10. OKR之剑·实战篇06:OKR致胜法宝-氛围&业绩双轮驱动(下)

    作者:vivo 互联网平台产品研发团队 本文是<OKR 之剑>系列之实战第 6 篇-- 本文介绍团队营造氛围的方法与实践.在业绩方面的探索与输出,在两方面分别总结了一些经验分享给大家. 一 ...