关于microsoft:基于-NET-6-的轻量级-Webapi-框架-FastEndpoints

78次阅读

共计 3924 个字符,预计需要花费 10 分钟才能阅读完成。


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


微软 MVP 实验室研究员

小试牛刀

接下来,我将用 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~

正文完
 0