前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints

基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints

作者头像
全球技术精选
发布于 2022-09-05 08:12:20
发布于 2022-09-05 08:12:20
93600
代码可运行
举报
文章被收录于专栏:全球技术精选全球技术精选
运行总次数:0
代码可运行

大家好,我是等天黑。

FastEndpoints 是一个基于 .NET 6 开发的开源 webapi 框架,它可以很好地替代 .NET Minimal APIs 和 MVC ,专门为开发效率而生,带来了全新的开发模式和编码体验。

另外对于 .NET 的中间件、认证、授权、日志,依赖注入这些也都是支持的,甚至有些还进行了加强,所以你很快就可以上手它。

小试牛刀

接下来,我将用 FastEndpoints 创建一个 webapi 应用,展示它是如何使用的,真的非常简单。

创建一个新项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet new web -n MyWebApp

进入项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd MyWebApp

安装 Nuget 包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet add package FastEndpoints

更新 Program.cs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
global using FastEndpoints;

var builder = WebApplication.CreateBuilder();
builder.Services.AddFastEndpoints();

var app = builder.Build();
app.UseAuthorization();
app.UseFastEndpoints();
app.Run(); 

添加一个 Request DTO

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyRequest
{
    public int Age { get; set; }

    public string Name { get; set; }
}

添加一个 Response DTO

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

然后添加下面的代码, 这是处理业务逻辑的地方

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 原生的特性的方式,这也是支持的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IHelloWorldService
{
    string SayHello();
}

public class HelloWorldService : IHelloWorldService
{
    public string SayHello() => "hello world!";
}

并且注册到 IOC 容器中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
builder.Services.AddScoped<IHelloWorldService, HelloWorldService>();

1. 构造函数注入

这是我们最熟悉的也是使用最多的方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 属性注入

服务实例可以通过属性的方式进行自动注入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 手动解析

也可以像下面这样,直接手动获取服务。

使用 TryResolveResolve() 方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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());
}

预先解析的服务

下面的三个服务已经预先解析过,我们可以直接在处理程序中使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
property: Config
service : IConfiguration

property: Env
service : IWebHostEnvironment

property: Logger
service : ILogger

非常方便地使用它们。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,你会发现这是何等的相似。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 半栈程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年02月 .NET CORE工具案例-FastEndpoints轻量级WebApi框架
FastEndpoints是Minimal API和MVC的开发人员友好替代品,它是基于REPR设计模式(请求-端点-响应),以便创建方便且可维护的端点,几乎没有样板文件。
愚公搬代码
2023/03/16
7410
【愚公系列】2023年02月 .NET CORE工具案例-FastEndpoints轻量级WebApi框架
.NET 轻量级、高效任务调度器:ScheduleTask
至于任务调度这个基础功能,重要性不言而喻,大多数业务系统都会用到,世面上有很多成熟的三方库比如Quartz,Hangfire,Coravel
郑子铭
2024/06/07
2490
.NET 轻量级、高效任务调度器:ScheduleTask
ASP.NET Core 6框架揭秘实例演示[21]:如何承载你的后台服务
借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这样一个承载服务。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
4860
ASP.NET Core 6框架揭秘实例演示[21]:如何承载你的后台服务
.NET开发的Minimal Web Api交互模块
今天给大家推荐一个.NET开发的REPR(Request-Endpoint-Response)轮子Biwen.QuickApi。Biwen.QuickApi提供一种简单集成的Minimal Web Api交互模块 遵循了 REPR 设计。
郑子铭
2023/10/13
2830
.NET开发的Minimal Web Api交互模块
.NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记
创建 ResourceController,通过 ResourceManager 获取所有 Resource
郑子铭
2022/02/21
3200
.NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记
Orleans 知多少 | 3. Hello Orleans
是的,Orleans v3.0.0 已经发布了,并已经完全支持 .NET Core 3.0。 所以,Orleans 系列是时候继续了,抱歉,让大家久等了。 万丈高楼平地起,这一节我们就先来了解下Orleans的基本使用。
圣杰
2020/06/19
8420
Orleans 知多少 | 3. Hello Orleans
.net core HttpClient 使用之消息管道解析(二)
前面分享了 .net core HttpClient 使用之掉坑解析(一),今天来分享自定义消息处理HttpMessageHandler和PrimaryHttpMessageHandler 的使用场景和区别
Jlion
2022/04/07
7220
.net core HttpClient 使用之消息管道解析(二)
重新整理 .net core 周边阅读篇————AspNetCoreRateLimit[一]
https://github.com/stefanprodan/AspNetCoreRateLimit
用户4268038
2021/10/08
1.1K0
【源码解读】Vue与ASP.NET Core WebAPI的集成
在前面博文【Vue】Vue 与 ASP.NET Core WebAPI 的集成中,介绍了集成原理:在中间件管道中注册SPA终端中间件,整个注册过程中,终端中间件会调用node,执行npm start命令启动vue开发服务器,向中间件管道添加路由匹配,即非 api 请求(请求静态文件,js css html)都代理转发至SPA开发服务器。
DDGarfield
2022/06/23
8820
【源码解读】Vue与ASP.NET Core WebAPI的集成
造轮子之文件管理
前面我们完成了设置管理,接下来正好配合设置管理来实现文件管理功能。 文件管理自然包括文件上传,下载以及文件存储功能。设计要求可以支持扩展多种存储服务,如本地文件,云存储等等。
饭勺oO
2023/10/25
3320
造轮子之文件管理
.NET 6+Semantic Kernel快速接入OpenAI接口
今天我们快速地使用Semantic Kernel来集成OpenAI,使用20来行代码快速实现一个简单的AIGC应用。
Edison Zhou
2024/05/30
2160
.NET 6+Semantic Kernel快速接入OpenAI接口
MediatR: .NET 平台上的命令查询职责分离 (CQRS) 库
MediatR 是一个轻量级的库,用于实现应用程序中的中介者模式【实现命令查询职责分离 (CQRS) 模式和面向消息的架构】。通过将请求(命令或查询)与处理程序解耦,简化了应用程序的逻辑分层和扩展。
郑子铭
2025/04/04
620
MediatR: .NET 平台上的命令查询职责分离 (CQRS) 库
.net 温故知新【17】:Asp.Net Core WebAPI 中间件
到这篇文章为止,关于.NET "温故知新"系列的基础知识就完结了,从这一系列的系统回顾和再学习,对于.NET core、ASP.NET CORE又有了一个新的认识。
SpringSun
2024/01/19
3070
.net 温故知新【17】:Asp.Net Core WebAPI  中间件
开源一款功能强大的 .NET 消息队列通讯模型框架 Maomi.MQ
Maomi.MQ.RabbitMQ 是一个用于专为 RabbitMQ 设计的发布者和消费者通讯模型,大大简化了发布和消息的代码,并提供一系列简便和实用的功能,开发者可以通过框架提供的消费模型实现高性能消费、事件编排,框架还支持发布者确认机制、自定义重试机制、补偿机制、死信队列、延迟队列、连接通道复用等一系列的便利功能。开发者可以把更多的精力放到业务逻辑中,通过 Maomi.MQ.RabbitMQ 框架简化跨进程消息通讯模式,使得跨进程消息传递更加简单和可靠。
痴者工良
2024/06/14
4290
开源一款功能强大的 .NET 消息队列通讯模型框架 Maomi.MQ
ASP.NET Core 中断请求了解一下(翻译)
假设有一个耗时的Action,在浏览器发出请求返回响应之前,如果刷新了页面,对于浏览器(客户端)来说前一个请求就会被终止。而对于服务端来说,又是怎样呢?前一个请求也会自动终止,还是会继续运行呢?
圣杰
2018/09/20
1.3K0
ASP.NET Core 中断请求了解一下(翻译)
Maomi.MQ 2.0 | 功能强大的 .NET 消息队列通讯模型框架
在本篇教程中,将介绍 Maomi.MQ.RabbitMQ 的使用方法,以便读者能够快速了解该框架的使用方式和特点。
痴者工良
2025/03/26
1620
Maomi.MQ 2.0 | 功能强大的 .NET 消息队列通讯模型框架
asp.net core启动源码以及监听,到处理请求响应的过程
        asp.net core发布至今已经将近6年了,很多人对于这一块还是有些陌生,或者说没接触过;接触过的,对于asp.net core整个启动过程,监听过程,以及请求过程,响应过程也是一知半解,可能有的同学在面试中有被问过整个的启动过程;对此,有个想法就是针对于之前没有接触过core的,后续会持续输出asp.net core方面的基础,包括IOC,中间件,主机,日志,以及服务器,配置,options等方面的入门讲解;本篇博客先粗略的讲解一下,asp.net core整个程序启动过程,以及启动之后都干了什么,我们的请求是如何到达我们的接口的。
陈显达
2022/11/07
2K0
asp.net core启动源码以及监听,到处理请求响应的过程
.NET Core使用 CancellationToken 取消API请求
即使用户刷新了浏览器,取消了原始请求,而对于服务器来说,API也不会知道它正在计算的值将在结束时被丢弃,刷新五次,服务器将触发 5 个请求。
Chester Chen
2024/03/25
3580
.NET Core使用 CancellationToken 取消API请求
ASP.NET Core 奇技淫巧之接口代理转发
要前后端分离~ 然因为种种原因..没办法用用纯前端的框架(其实是学习成本高,又没钱请前端开发人员)...
GuZhenYin
2020/08/13
5820
ASP.NET Core 奇技淫巧之接口代理转发
.Net5中WebApi使用MEF2框架的使用
最近有个产品需要设计重构,主要后端是C#和前端是Android程序,后端也考虑过微服务,但是觉得根据用户体量来说,有点太重了,但是也是想要团队分工,所以就考虑了MEF的方式,原来MEF的插件方式在《C# MEF插件的使用及Demo分享》的文章中介绍过,不过当时用的是WinForm版本,现在是要在NET5上使用,所以就专门做了DEMO程序来验证可行性。
Vaccae
2021/08/25
1.1K0
推荐阅读
相关推荐
【愚公系列】2023年02月 .NET CORE工具案例-FastEndpoints轻量级WebApi框架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验