FastEndpoints 是基于 ASP.NET Core 的轻量级、高性能 Web API 开发框架,采用 REPR (请求-端点-响应)设计模式。

本人用FastEndpoints做了一个REST API很优雅的Case

一、以下是http测试

@HostAddress = http://localhost:5167
### 获取列表
GET {{HostAddress}}/users?Page=1&Size=10 ### 添加
PUT {{HostAddress}}/users
Content-Type:application/json {
"Name" : "Jxj"
} ### 获取单个
GET {{HostAddress}}/users/1 ### 修改
PATCH {{HostAddress}}/users/1
Content-Type:application/json {
"Name" : "Jxj2"
} ### 删除
DELETE {{HostAddress}}/users/1

地址规则非常简单清晰,只有两种地址却能支持添、删、改、查四种操作

1. 添加使用/users

  使用PUT请求,含义是向一个集合添加资源

2. 删除使用/users/{Id}(Id是标识)

  使用DELETE请求,表示从集合移除该标识的资源

3. 修改也使用/users/{Id}}(Id是标识)

  使用PATCH请求,表示该标识资源的哪些字段被修改了(这与Elasticsearch的一样)

4. 查询GET请求

4.1 查询单条使用/users/{Id}}(Id是标识)

4.2 查询多条使用/users

二、项目结构也是非常简单清晰

注:实际项目的模型和仓储应该是单独项目,这里简单示意就放一起了

本人非常喜欢这样的项目,每个API方法一个文件夹

而且每个文件夹下的文件名非常有意思,都是Endpoint、Mapper和Models,对于本人这种纠结命名规则的反而是这个解脱

应用层业务逻辑复杂的可以在增加一个Data.cs文件

这种文件结构FastEndpoints是有提供模板生成的,当然手动写也不复杂

三、Mapper的优雅实现

定义接口IPocoConverter实现任意两种类型的转化,直接用IOC注入就好了

以下是Create的Mapper的实现

[RegisterService<Mapper>(LifeTime.Singleton)]
public sealed class Mapper(
UserRepository repository,
IPocoConverter<Request, User> requestConverter,
IPocoConverter<User, Response> responseConverter)
: Mapper<Request, Response, User>
{
#region 配置
private readonly UserRepository _repository = repository;
private readonly IPocoConverter<Request, User> _requestConverter = requestConverter;
private readonly IPocoConverter<User, Response> _responseConverter = responseConverter;
#endregion
public override User ToEntity(Request r)
{
User entity = _requestConverter.Convert(r);
return Save(entity);
}
public override Response FromEntity(User e)
=> _responseConverter.Convert(e);
#region Data
User Save(User entity)
=> _repository.Add(entity);
#endregion
}

这里有一个微软IOC不得不说的槽点,IServiceCollection支持泛型类的注册,却不支持泛型方法的注册

好在本人找到了博客园一个大佬(@coredx)的开源项目(https://www.cnblogs.com/coredx/p/18138360)

封装一个简单IOC注入泛型转化的方法如下:

services.UseConverter(PocoEmit.Mapper.Global);

还需要显示调用@coredx的以下方法

builder.Host.UseServiceProviderFactory(new TypedImplementationFactoryServiceProviderFactory());

注: 以下调用本人是翻开大佬源码才摸索出来的,按大佬的文档尝试了很多次都失败了,大佬的文档估计好久没更新了

四、优雅的修改

这个修改还是使用的本人上一篇文章(https://www.cnblogs.com/xiangji/p/18979384)提到的MyDelta,微软OData的Delta的变体

public sealed class Endpoint(UserModifyDTOValidator validationRules) : Endpoint<Request, Response, Mapper>
{
// ...
public override async Task HandleAsync(Request req, CancellationToken c)
{
MyDelta<UserModifyDTO> dto = req.User;
dto.Patch(dto.Instance);
var result = validationRules.Validate(dto);
if(!result.IsValid)
{
ThrowError(result.Errors[0]);
}
User? entity = Map.ToEntity(req);
if (entity is null)
{
ThrowError($"Id = {req.Id} 的User不存在");
}
var res = Map.FromEntity(entity);
await Send.OkAsync(res, c);
}
}
[RegisterService<Mapper>(LifeTime.Singleton)]
public sealed class Mapper(
UserRepository repository,
IMyDeltaFactory deltaFactory,
IPocoConverter<User, Response> responseConverter)
: Mapper<Request, Response, User?>
{
// ...
public override User? ToEntity(Request r)
{
var user0 = GetById(r.Id);
if (user0 == null)
return null;
var delta = deltaFactory.Create(user0, r.User.Data);
return Modify(delta);
}
}

获取并验证DTO的MyDelta(增量),再转化为模型实体的增量,调用仓储处理

以下项目代码GitHub地址: https://github.com/donetsoftwork/MyEmit/tree/main/IntegrationTests/TestApi

gitee同步更新: https://gitee.com/donetsoftwork/MyEmit/tree/main/IntegrationTests/TestApi

如果大家喜欢请动动您发财的小手手帮忙点一下Star。

优雅的.net REST API之FastEndpoints的更多相关文章

  1. 如何更优雅地对接第三方API

    本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程 ...

  2. Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!

    前面介绍了Spring Boot 如何快速实现Restful api 接口,并以人员信息为例,设计了一套操作人员信息的接口.不清楚的可以看之前的文章:https://www.cnblogs.com/z ...

  3. Vue 使用typescript, 优雅的调用swagger API

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务,后端集成下Swagger,然后就可以提供一个在线文档地址给前端同学. 前端如何优雅的调用呢? ...

  4. 【JDK8】Java8 优雅的异步调用API CompletableFuture

    1.CompletableFuture是什么? CompletableFuture是JDK8的新特性之一,是异步调用相关的API,用于简化异步调用,提高异步调用的效率 2.CompletableFut ...

  5. 更优雅的OrientDB Java API

    OrientDB API v1.0.0(OrientDB 3.x) Gitee OrientDB介绍 OrientDB是一个开源的NoSQL数据库管理系统,同时也是一款高性能的图数据库,支持ACID事 ...

  6. java优雅的使用elasticsearch api

    本文给出一种优雅的拼装elasticsearch查询的方式,可能会使得使用elasticsearch的方式变得优雅起来,使得代码结构很清晰易读. 建立elasticsearch连接部分请参看另一篇博客 ...

  7. Spring Security:如何在Postman中优雅地测试后端API(前后端分离)

    前言 在Postman中可以编写和执行自动化测试,使用 JavaScript 编写基本的 API 测试,自由编写任何用于自动化测试的测试方案. 在POSTMAN中读取Cookie值 1. 我们需要向& ...

  8. Atitit Atitit.软件兼容性原理----------API兼容 Qa7

    Atitit Atitit.软件兼容性原理----------API兼容 Qa7 1. 兼容性的重要性与反面教材1 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法 ...

  9. 如何设计一个优秀的API(转载)

    最近在整理框架的一些 API,觉得很有必要总结一下 API 兼容性的设计.下图是我自己当下的一些总结,慢慢维护: 网上搜索了一下,一个多月前,“标点符”已经发布了下面这篇文章,觉得写得非常不错,转载于 ...

  10. 如何设计一个优秀的API(转)

    到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的.一旦API发生变化,就可能对相关的调用者带来巨大的代价, ...

随机推荐

  1. Django REST框架中处理JWT令牌的认证的源码解析

    想了解`JWTAuthentication`这个类的源码解析.`JWTAuthentication`是来自`rest_framework_simplejwt.authentication`模块的,它用 ...

  2. TVM图级优化了解

    TVM图级优化按照优化范围,可分为局部优化和全局优化 局部优化是TVM图级优化的重点,其中算子融合是AI编译器必不可少的优化方法. 算子融合核心思想就是将多个算子合并成一个内核,因而无需将中间结果写回 ...

  3. C# 相等比较

    C# 相等比较 有两种类型的相等: 值相等:即两个值是一样的 引用相等:即引用是一样的,也就是同一个对象 默认地,对于值类型来讲,相等指的就是值相等:对于引用类型,相等就是指的引用相等. int a ...

  4. dify+MCP多应用,构建灵活的AI应用生态系统

    一.概述 前面几篇文章写很多MCP应用,基本上一个dify工作流使用一个MCP应用. 那么一个dify工作流,同时使用多个MCP应用,是否可以呢?答案是可以的. 先来看一下效果图 说明: 这里使用了问 ...

  5. Windows平台调试器原理与编写02.一般断点与反汇编引擎

    https://www.bpsend.net/thread-256-1-2.html 一般断点(软件断点) 断点的尊严 断的下来 走的过去 下次还来 所有合格的断点都应该满足这3个要求 OD下断点实际 ...

  6. 用脚手架创建odoo15项目

    Odoo 提供了一种机制来帮助建立一个新模块,odoo-bin有一个子命令脚手架来创建一个空模块 命令: $ odoo-bin scaffold <module name> <whe ...

  7. jupyter的使用 -- 快捷键

    jupyter的使用 1.快捷键的使用 插入cell:a,b 删除cell:x 执行cell:shift+enter 切换cell的模式:m,y cell执行后,在cell的左侧双击就可以回到cell ...

  8. 「Log」做题记录 2023.9.25-2023.10.29

    \(2023.9.25-2023.10.1\) \(\color{limegreen}{P3524}\) 考虑删掉两个不相连的点,这两个点必定一个在团内一个在团外,删掉 \(\frac{n}{3}\) ...

  9. prometheus配置自己电脑ip查看指标

    1.使用ipconfig获取自己电脑ip,在服务器使用:curl ip:1234  命令查看是否通,不通的话可能要关闭防火墙 2.在服务器的Prometheus安装目录:  编辑:prometheus ...

  10. 2025 最野 AI 创业攻略!从 0 孵化爆款软件的底层逻辑:技术打磨 + 精准推广双杀

    小伙伴们,上一篇内容我们讲到了自身的核心优势,那么今天大黄给大家讲讲我们的发展愿景. 我们的目标: 成为学习AI编程路上必看的内容合集知识库! 项目案例全部由真人编写实现,从0到1毫不保留全部展示出来 ...