前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2023年02月 .NET CORE工具案例-FastEndpoints轻量级WebApi框架

【愚公系列】2023年02月 .NET CORE工具案例-FastEndpoints轻量级WebApi框架

作者头像
愚公搬代码
发布2023-03-16 16:15:36
5240
发布2023-03-16 16:15:36
举报
文章被收录于专栏:历史专栏历史专栏

文章目录


前言

1.FastEndpoints介绍

FastEndpoints是Minimal API和MVC的开发人员友好替代品,它是基于REPR设计模式(请求-端点-响应),以便创建方便且可维护的端点,几乎没有样板文件。

FastEndpoints的性能与Minimal API 相当,甚至它更快,使用更少的内存并且每秒请求数比基准测试中的MVC控制器更高。对于比如:中间件、认证、授权、日志,依赖注入这些常用功能都支持,甚至有些还进行了加强。

设计主要是分为两种模式

  • 分层模式:mvc、mvp、mvvm等
  • 垂直模式:REPR设计模式

REPR设计模式就是垂直模式,系统的每个组件都是单独的一块,彼此并不影响,就像微服务那样。

2.REPR设计模式由来

MVC - 模型-视图-控制器旨在与用户界面配合使用。显然,视图是一个 UI 组件。如果您正在构建 API,则没有视图,因此您充其量使用的是 MC 模式,或者您可以将其称为模型-操作-控制器并获取 MAC 模式。关键是,你已经没有将MVC用于你的API,所以考虑一个更合适的模式应该不是一个很大的问题。

API 端点是非常独立的,每个端点都可以使用三个组件来描述:

请求:终结点所需的数据形状 终结点:终结点在给定请求时执行的逻辑 响应:终结点返回给调用方的响应 结合这三个元素,你会得到请求-端点-响应或 REPR 模式,我称之为“收割者”。(是的,你可以选择RER,但“rurr”模式听起来并不那么有趣)。

并非所有终结点都需要其请求或响应的实际数据,在某些情况下,不接收任何输入或仅返回 HTTP 状态代码。但是,在此模式中,空请求或响应仍然是有效的请求或响应,就像某些 MVC 操作不需要模型一样。

使用 API 端点库时,您可以将请求、终端节点和响应类型分组在一起,这样就无需在某些“视图模型”或“dtos”文件夹中四处寻找合适的类型。它减少了摩擦,使使用单个端点变得更加容易。

FastEndpoints文档::https://fast-endpoints.com/

在这里插入图片描述
在这里插入图片描述

FastEndpoints官网:https://github.com/FastEndpoints

在这里插入图片描述
在这里插入图片描述

一、FastEndpoints基本使用

1.安装包

代码语言:javascript
复制
FastEndpoints
在这里插入图片描述
在这里插入图片描述

2.注入

Program.cs 添加如下代码

代码语言:javascript
复制
#region 配置FastEndpoints
builder.Services.AddFastEndpoints();
#endregion
#region 使用FastEndpoints
app.UseFastEndpoints();
#endregion
在这里插入图片描述
在这里插入图片描述

3.添加请求响应DTO

代码语言:javascript
复制
public class MyRequest
{
    public int Age { get; set; }
    public string Name { get; set; }
}

public class MyResponse
{
    public int Id { get; set; }
    public int Age { get; set; }
    public string Name { get; set; }
    public DateTime CreateTime { get; set; }
}
在这里插入图片描述
在这里插入图片描述

4.添加处理节点

代码语言:javascript
复制
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);
    }
}
在这里插入图片描述
在这里插入图片描述

参数说明:

  • Configure:相当于特性
  • HandleAsync:相当于方法

对于Configure也是可以用特性方式的

代码语言:javascript
复制
[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 { });
    }
}

4.执行

在这里插入图片描述
在这里插入图片描述

可以看到返回了数据

二、FastEndpoints的依赖注入

1.定义服务

代码语言:javascript
复制
public interface IHelloWorldService
{
    string SayHello();
}

public class HelloWorldService : IHelloWorldService
{
    public string SayHello() => "hello world!";
}
在这里插入图片描述
在这里插入图片描述

2.注入服务

代码语言:javascript
复制
builder.Services.AddScoped<IHelloWorldService, HelloWorldService>();
在这里插入图片描述
在这里插入图片描述

3.使用

3.1 构造函数注入

1、代码

代码语言:javascript
复制
public class MyEndpoint : EndpointWithoutRequest
{
    private IHelloWorldService _helloService;

    public MyEndpoint(IHelloWorldService helloScv)
    {
        _helloService = helloScv;
    }

    public override void Configure()
    {
        Get("/api/hello-world");
        AllowAnonymous();
    }

    public override async Task HandleAsync(CancellationToken ct)
    {
        await SendAsync(_helloService.SayHello());
    }
}
在这里插入图片描述
在这里插入图片描述

2、运行

在这里插入图片描述
在这里插入图片描述

3.2 属性注入

1、代码

代码语言:javascript
复制
public class MyEndpoint : EndpointWithoutRequest
{
    public IHelloWorldService HelloService { get; set; }

    public override void Configure()
    {
        Get("/api/hello-world");
        AllowAnonymous();
    }

    public override async Task HandleAsync(CancellationToken ct)
    {
        await SendAsync(HelloService.SayHello());
    }
}
在这里插入图片描述
在这里插入图片描述

2、运行

在这里插入图片描述
在这里插入图片描述

3.3 手动注入

1、代码

代码语言:javascript
复制
public class MyEndpoint : EndpointWithoutRequest
{
    public override void Configure()
    {
        Get("/api/hello-world");
        AllowAnonymous();
    }

    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());
    }
}
在这里插入图片描述
在这里插入图片描述

TryResolve 或 Resolve() 是可以直接调用服务的

2、运行

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-02-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
    • 1.FastEndpoints介绍
      • 2.REPR设计模式由来
      • 一、FastEndpoints基本使用
        • 1.安装包
          • 2.注入
            • 3.添加请求响应DTO
              • 4.添加处理节点
                • 4.执行
                • 二、FastEndpoints的依赖注入
                  • 1.定义服务
                    • 2.注入服务
                      • 3.使用
                        • 3.1 构造函数注入
                        • 3.2 属性注入
                        • 3.3 手动注入
                    相关产品与服务
                    消息队列 TDMQ
                    消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档