头图

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


FastEndpoints 是一个基于 .NET 6 开发的开源 webapi 框架,它可以很好地替代 .NET Minimal APIs 和 MVC ,专门为开发效率而生,带来了全新的开发模式和编码体验。另外对于 .NET 的中间件、认证、授权、日志,依赖注入这些也都是支持的,甚至有些还进行了加强,所以你很快就可以上手它。


微软MVP实验室研究员
image.png
图片

小试牛刀

接下来,我将用 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>();

▌构造函数注入

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

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());
    }
}

▌属性注入

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

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());
    }
}

▌手动解析

也可以像下面这样,直接手动获取服务。
使用 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 版本控制等等。

希望对您有用!

点击这里获取相关文档
点击这里获取Github内容


微软最有价值专家(MVP)

图片
微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项。29年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项。

MVP是经过严格挑选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的热情并乐于助人的专家。MVP致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人,并最大程度地帮助微软技术社区用户使用 Microsoft 技术。

更多详情请登录官方网站:
https://mvp.microsoft.com/zh-cn


点击这里即刻加入微软MVP~

微软技术生态官方平台。予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

397 声望
961 粉丝
0 条评论
推荐阅读
如何扛住游戏流量高峰?Evil Dead 主创这样说
“鬼玩人 (Evil Dead)”系列是恐怖幽默动作电影的经典之作,40多年的IP经典化历程中,《鬼玩人》(Evil Dead)正在推出该系列的第5部电影作品。同时也从经典三部曲中衍生出了“Evil Dead: The Game”——主打生存挑战的...

微软技术栈阅读 81

封面图
必看!.NET 7 在网络领域的四大更新
最新的 .NET 7 现已发布,我们想介绍一下其在网络领域所做的一些有趣的更改和添加。这篇文章我们将讨论 .NET 7 在 HTTP 空间、新 QUIC API、网络安全和 WebSockets 方面的变化。

微软技术栈1阅读 432

封面图
传奇程序员 John Carmack 怒斥 Meta;微软将永久禁用 IE;Okta 私有代码库被入侵|思否周刊
40S 新闻速递传奇程序员 John Carmack 离开 Meta,怒斥公司低效NIST 建议 2030 年底前淘汰 SHA-1 加密算法微软将于 2023 年 2 月 14 日永久禁用 IEGoogle 苹果 Mozilla 合作构建新浏览器基准测试Okta 私有代码库...

六一1阅读 827

使用 .NET 7、Blazor 和 .NET MAUI 构建你自己的 Podcast App
.NET Podcast App 首次在 .NET Conf 2021上推出,最近进行了更新以在 .NET Conf 2022 keynote 中突出显示 .NET 7 中的新功能。该 Podcast App 已准备好使用展示 .NET,ASP.NET Core,Blazor,.NET MAUI,Azure Co...

微软技术栈阅读 678

封面图
官方盘点 .NET 7 新功能
.NET 7 为C# 11/F# 7、.NET MAUI、ASP.NET Core/Blazor、Web API、WinForms、WPF 等应用程序带来了更高的性能和新功能。使用 .NET 7,您还可以轻松地将 .NET 7 项目容器化,在 GitHub 操作中设置 CI/CD 工作流,...

微软技术栈阅读 606

封面图
MASA Stack 1.0 发布会 倒计时一天
​扫描二维码,预约直播2023/1/16 14:00 与你不见不散发布会精彩看点抢先看MASA Stack 1.0 趋势篇世界技术圈在发什么?应用现代化宣布MASA Stack1.0版本正式发布MASA Stack 1.0 产品篇1.0产品架构介绍一站式现代化...

MASA技术团队阅读 481

通过 .NET 完成机器学习的整个流程,这个平台可以!
.NET 是⼀个跨平台,全场景应用的开源技术。你有在用 .NET 做机器学习/深度学习的应用吗?如果从框架角度,ML.NET/Tensorflow.NET/不断在进步的 TorchSharp 通过几年的发展已经开始稳定,但如果在⼀些⼤型项目上...

微软技术栈阅读 458

封面图

微软技术生态官方平台。予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

397 声望
961 粉丝
宣传栏