基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints
大家好,我是等天黑。
FastEndpoints 是一个基于 .NET 6 开发的开源 webapi 框架,它可以很好地替代 .NET Minimal APIs 和 MVC ,专门为开发效率而生,带来了全新的开发模式和编码体验。
另外对于 .NET 的中间件、认证、授权、日志,依赖注入这些也都是支持的,甚至有些还进行了加强,所以你很快就可以上手它。
小试牛刀
接下来,我将用 FastEndpoints 创建一个 webapi 应用,展示它是如何使用的,真的非常简单。
创建一个新项目
dotnet new web -n MyWebApp
进入项目
cd MyWebApp
安装 Nuget 包
dotnet add package FastEndpoints
更新 Program.cs
global using FastEndpoints;
var builder = WebApplication.CreateBuilder();
builder.Services.AddFastEndpoints();
var app = builder.Build();
app.UseAuthorization();
app.UseFastEndpoints();
app.Run();
添加一个 Request DTO
public class MyRequest
{
public int Age { get; set; }
public string Name { get; set; }
}
添加一个 Response DTO
public class MyResponse
{
public int Id { get; set; }
public int Age { get; set; }
public string Name { get; set; }
public DateTime CreateTime { get; set; }
}
添加一个 Endpoint Class
然后添加下面的代码, 这是处理业务逻辑的地方
public class MyEndpoint : Endpoint<MyRequest>
{
public override void Configure()
{
Post("/api/user/create");
AllowAnonymous();
}
public override async Task HandleAsync(MyRequest req, CancellationToken ct)
{
var response = new MyResponse()
{
Id = 1,
Age = req.Age,
Name = req.Name,
CreateTime = DateTime.Now
};
await SendAsync(response);
}
}
准备工作都好了,直接启动我们的 webapi 项目。
然后用 Postman 或者其他工具,向 /api/user/create 端点发送 POST 请求。
创建了一个用户,并返回了用户信息,就是这么简洁,这就是 FastEndpoints。
你可能注意到了上面的 Configure()方法,指定了 Http 动词和端点。 当然,你也可以使用 .NET 原生的特性的方式,这也是支持的。
[HttpPost("/my-endpoint")]
[Authorize(Roles = "Admin,Manager")]
public class UpdateAddress : Endpoint<MyRequest, MyResponse>
{
public override async Task HandleAsync(MyRequest req, CancellationToken ct)
{
await SendAsync(new MyResponse { });
}
}
依赖注入
在 FastEndpoints 中,可以使用三种方式来访问 IOC 容器中注册的服务。
假设我们有一个 HelloWorldService 。
public interface IHelloWorldService
{
string SayHello();
}
public class HelloWorldService : IHelloWorldService
{
public string SayHello() => "hello world!";
}
并且注册到 IOC 容器中。
builder.Services.AddScoped<IHelloWorldService, HelloWorldService>();
1. 构造函数注入
这是我们最熟悉的也是使用最多的方式。
public class MyEndpoint : EndpointWithoutRequest
{
private IHelloWorldService _helloService;
public MyEndpoint(IHelloWorldService helloScv)
{
_helloService = helloScv;
}
public override void Configure()
{
Get("/api/hello-world");
}
public override async Task HandleAsync(CancellationToken ct)
{
await SendAsync(_helloService.SayHello());
}
}
2. 属性注入
服务实例可以通过属性的方式进行自动注入。
public class MyEndpoint : EndpointWithoutRequest
{
public IHelloWorldService HelloService { get; set; }
public override void Configure()
{
Get("/api/hello-world");
}
public override async Task HandleAsync(CancellationToken ct)
{
await SendAsync(HelloService.SayHello());
}
}
3. 手动解析
也可以像下面这样,直接手动获取服务。
使用 TryResolve 或 Resolve() 方法。
public override async Task HandleAsync(CancellationToken ct)
{
IHelloWorldService? helloSvc = TryResolve<IHelloWorldService>();
if (helloSvc is null)
ThrowError("service not resolved!");
var logger = Resolve<ILogger<MyEndpoint>>();
logger.LogInformation("hello service is resolved...");
await SendAsync(helloSvc.SayHello());
}
预先解析的服务
下面的三个服务已经预先解析过,我们可以直接在处理程序中使用。
property: Config
service : IConfiguration
property: Env
service : IWebHostEnvironment
property: Logger
service : ILogger
非常方便地使用它们。
public override async Task HandleAsync(CancellationToken ct)
{
Logger.LogInformation("this is a log message");
var isProduction = Env.IsProduction();
var smtpServer = Config["SMTP:HostName"];
...
}
架构模式
如果你写过 Go Web,你会发现这是何等的相似。
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)
})
http.ListenAndServe(":80", nil)
}
FastEndpoints 遵循了 REPR 设计 (Request-Endpoint-Response),这和我们常说的 MVC 模式是不一样的。
思考一下,如果后端只是一个 webapi 应用,没有 View, 那它就变成了 MC 架构 。是不是很奇怪,那为什么不用 REPR 模式呢?
从另外一个角度上说,“分层架构” 是我们很熟悉和经常使用的,代码被分成不同的层。
这样的好处也是显而易见的。它们以解耦的方式组合在一起,在需要时,我们可以很方便的替换其中的层。
还有一种架构称为 “垂直切片架构", 系统的每个组件都是单独的一块,彼此并不影响,就像微服务那样。
而 FastEndpoints 正是使用了下面的 “垂直切片架构"。
总结
如您所见,FastEndpoints 是一个灵活高效的 webapi 框架。另外它还有其他的功能,比如异常处理,集成和单元测试,限流,API 版本控制等等。
扫码关注【半栈程序员】,获取最新文章。
文档: https://fast-endpoints.com/
Github: https://github.com/FastEndpoints
基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints的更多相关文章
- MakaJs:基于 React, Redux 的轻量级前端框架
github: maka.js 留下您宝贵的STAR!谢谢 maka maka源于中文码咖,意为写代码的大咖 一眼即可看懂的前端框架,简约而不简单 1.安装 bash sudo npm i -g @m ...
- Fd.Service 轻量级WebApi框架
News December 06 2014: Version 1.0.0.8Add Register Route Configuration iis 7 Integrated Mode: <sy ...
- 微博轻量级RPC框架Motan
Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...
- webapi框架搭建系列博客
webapi框架搭建系列博客 webapi框架搭建-创建项目(一) webapi框架搭建-创建项目(二)-以iis为部署环境的配置 webapi框架搭建-创建项目(三)-webapi owin web ...
- 微博轻量级RPC框架Motan正式开源:支撑千亿调用
支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微 ...
- 基于flask的轻量级webapi开发入门-从搭建到部署
基于flask的轻量级webapi开发入门-从搭建到部署 注:本文的代码开发工作均是在python3.7环境下完成的. 关键词:python flask tornado webapi 在python虚 ...
- webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制
webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...
- webapi框架搭建-安全机制(三)-简单的基于角色的权限控制
webapi框架搭建系列博客 上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使 ...
- 分享自己写的基于Dapper的轻量级ORM框架~
1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...
随机推荐
- 动态线程池框架 DynamicTp v1.0.6版本发布。还在为Dubbo线程池耗尽烦恼吗?还在为Mq消费积压烦恼吗?
DynamicTp 简介 DynamicTp 是一个基于配置中心实现的轻量级动态线程池管理工具,主要功能可以总结为 动态调参.通知报警.运行监控.三方包线程池管理等几大类. 经过几个版本迭代,目前最新 ...
- Linux常用命令-创建用户修改密码-useradd
命令简介 useradd/userdel 创建新用户/删除用户,需要管理员权限操作. 在创建用户时,如果不配置密码,用户的默认密码是不可用的,所以,useradd命令一般与passwd命令配合使用,下 ...
- MySQL-4-DDL
DDL:数据定义语言 创建create 创建库 语法:create database [if not exists]库名 # 创建库 CREATE DATABASE IF NOT EXISTS boo ...
- 用console画条龙?
相识 console一定是各位前端er最熟悉的小伙伴了,无论是console控制台,还是console对象,做前端做久了,打开一个网页总是莫名自然的顺手打开控制台,有些调皮的网站还会故意在控制台输出一 ...
- 周报?谁还写周报啊?不都用Python小工具: 发个周报邮件给老板就行还写周报啊?不都用Python小工具: 发个周报邮件给老板就行
缘起: 新跳槽到一家公司, 没想到第一个挑战居然是每周都要发周报. 告诉老板这周都干了些什么和下周准备干什么. 我记性不好, 常常忘事儿.所以很多时候周报都会忘记发送. 于是, 就决定写一个小工具好了 ...
- Java获取当天或者明天等零点时间(00:00:00)0时0分0秒的方法
SimpleDateFormat sdfYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = ...
- NC24866 [USACO 2009 Dec S]Music Notes
NC24866 [USACO 2009 Dec S]Music Notes 题目 题目描述 FJ is going to teach his cows how to play a song. The ...
- 选择结构-穿透的switch语句和循环结构-循环概述
case的穿透性 在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运 行,直到遇到break,或者整体switch结束 publi ...
- Linux sed工具的使用
基础知识 - 行编辑工具: 一行一行处理文件内容 - 全屏编辑工具:一次性将文件所有内容加载到内存中 sed编辑器: Stream Editor 工作原理: 逐行处理文件内容,一次读取一行内容到模式空 ...
- Qt+ECharts开发笔记(三):ECharts的柱状图介绍、基础使用和Qt封装Demo
前言 上一篇成功是EChart随着Qt窗口变化而变化,本篇将开始正式介绍柱状图介绍.基础使用,并将其封装一层Qt. 本篇的demo实现了隐藏js代码的方式,实现了一个条形图的基本交互方式,即Qt ...