首页 > 其他分享 >MinimalApis自动注册

MinimalApis自动注册

时间:2024-03-12 11:14:39浏览次数:17  
标签:app 接口 MinimalApis IEndPoint 自动 注册 var

前言

Asp.Net Core 6 推出了最小 Api(MinimalApis)来简化WebApi的开发,在前后端分离的趋势下越来越多的后端服务只提供Api接口,但是用Controller的开发模式会引入MVC的架构,MinimalApis的出现就是来减少框架的依赖,让 Api 的开发更加简洁,并且可以优化性能。

本文的重点是解决MinimalApis的使用痛点,让大家如何优雅的使用MinimalApis,教程大家可以浏览官网。

MinimalApis教程一览

本文的完整源代码在末尾

创建 MinimalApis 的项目

VS 创建新项目->输入项目名字然后点击下一步-> 使用控制器的 CheckBox 确定取消勾选

当然还有其他的方式比如 命令行dotnet new web 或者是使用 vs 创建一个Asp.Net Core 空的模板,自己添加 MinimalApi 的配置等

当我们创建完项目后大概的结构是这样的

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapGet("/sayHello", (string name) =>
{
    return $"hello {name}";
}).WithName("sayHello")
.WithOpenApi();
app.Run();

原模板中是获取天气的接口,我简单改了一下让看起来更简单。

endPoint是通过app.MapGet,app.MapPost,app.MapPut,app.MapDelete等一系列IEndpointRouteBuilder的扩展方法注册到应用程序中去的,设想一下一个项目到几十个,几百个接口的程度那我们的系统将难以维护。

当然也可以把扩展方法写到几个扩展方法中然后在 Program 中引入,比如app.UseUserApi,app.UseRoleApi在业务接口扩展的时候不停的手动加这些扩展方法也不够优雅。

下面提供一种自动注册的方案

自动注册MinimalApis

自动注册 MinimalApis 不仅仅是为了简化我们注册的流程,更重要的是为了符合业务的垂直结构,为了业务更好的进行业务规划,参考 Controller 的开发流程,通过建立标准的注册机制,让我们的代码维护性更高。

第一步创建 IEndPoint 的接口

让我们来定义一个接口来表示我们一个或者是一组路由的终结点(endPoint)

public interface IEndPoint
{
    void MapEndPoints(IEndpointRouteBuilder app);
}

创建EndPoints文件夹

为什么要创建这个文件夹呢,可以理解和 Controllers 文件夹约定一样,我们所有的 IEndPoint 的实现都在这里,每一个 IEndPoint 的实现都处理一组相关的业务。
设想的结构是这样的

project-name
│
├── EndPoints
│   ├── TodoEndPoints.cs
│   └── UserEndPoints.cs

接下来我们实现一个相关业务的 EndPoints

public class TodoEndPoints : IEndPoint
{
    public void MapEndPoints(IEndpointRouteBuilder app)
    {
        var group = app.MapGroup("Todo");//EndPoint 前缀
        group.WithTags("Todo");//OpenApi Swagger 分组
        group.MapGet("/", () => "Get").WithSummary("Get 接口");
        group.MapPost("/", () => "Post").WithSummary("Post 接口");
        group.MapDelete("/", () => "Get").WithSummary("Delete 接口");
        group.MapPut("/", () => "Put").WithSummary("Put 接口");
    }
}

反射注册

Program.cs 的中通过反射获取所有的 IEndPoint 的实现来批量注册注册到我们的路由中。
实现如下

public static class EndPointsExtensions
{
    public static WebApplication RegisterEndPoints(this WebApplication app)
    {
        var types = Assembly.GetEntryAssembly()?.GetTypes()?.Where(type => type.IsAssignableTo(typeof(IEndPoint)) && type is { IsAbstract: false, IsInterface: false });
        if (types?.Count() > 0)
        {
            foreach (var type in types)
            {
                var ep = ActivatorUtilities.CreateInstance(app.Services, type);
                (ep as IEndPoint)!.MapEndPoints(app);

            }
        }
        return app;
    }
}

定义了一个WebApplication的扩展来注册我们的endPoints,所有被注册的实现必须要非抽象的并且不是接口还要继承IEndPoint

program.cs 添加注册

var app = builder.Build();

app.RegisterEndPoints();//路由终结点自动注册

在 app 下执行我们的RegisterEndPoints扩展方法,此时所有符合条件的路由终结点将被注册到应用程序中。

测试

项目直接Run
Swagger 自动打开调用一下接口测试即可

测试效果图

可以看到我们所有的路由终结点都成功被注册到了应用程序中

标签:app,接口,MinimalApis,IEndPoint,自动,注册,var
From: https://www.cnblogs.com/ruipeng/p/18067855

相关文章

  • PXE批量安装操作系统自动化
    PXEz自动化在PXE服务器操作:*yum-yinstalldhcpxinetdtftptftp-server**yum-yinstallsystem-config-kickstart**yum-yinstallsyslinux**[root@localhostks]#cat/etc/dhcp/dhcpd.conf**subnet192.168.7.0netmask255.255.255.0{**range192.168.7.100192.1......
  • UI自动化、性能、API测试一体平台:RunnerGo
    UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势,包括提高测试效率、减少人力成本、提升软件质量等。同时,可视化工具为UI自动化测试带来了更多便利和灵活性。RunnerGo近期上线脚本录制器,根据你的测试操作直接生成UI自动化测试脚本,下面是使用方法Step......
  • Python实现企业微信自动打卡程序二:跳过节假日,随机打卡时间,定时任务,失败通知
    一、介绍在上节Python实现企业微信上下班自动打卡程序内容之后,我们继续优化自动打卡程序。接下来增加如下内容:实现打卡时间随机范围处理节假日不打卡的情况实现定时调度打卡打卡成功或失败通知自己二、实现打卡时间随机范围既然我们程序写完后需要定时执行,那定时执行打......
  • SpringBoot自动配置原理解析
    一、什么是SpringBoot自动配置首先介绍一下什么是SpringBoot,SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的特点是:能使程序开发者快速搭建一套开发环境。SpringBoot能将主流的开发框架(例如SpringMVC,Dubbo,Mybatis,Redis等),做到像Maven导......
  • ubuntu20.04-通过docker安装jenkins并自动化发布java
    前言jenkins需要git、maven和node,其中maven和node手动添加,git和git环境是jenkins镜像自带了的。如果删除了docker对应的jenkins容器后(删除前一定备份jenkins_home整个文件夹,否则怕前功尽弃:tar-czvfjenkins_home.tar.gz/var/jenkins_home)如果删除了容器,需要重新安装并配置m......
  • 海量用户注册整合布隆过滤器实现用户名唯一功能
    布隆过滤器介绍布隆过滤器可以理解为一个固定大小的数组,数组的大小初始化时自定义,每个元素都占用1bit,每个元素都是0或者1,所以可以对海量的数据进行判断,原理图如图所示根据原理图可以得出信息,布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定......
  • C#微服务领事注册
    微服务领事注册首先要先下载Consul这个软件并安装新建一个空项目NuGet下载这两个包搭建微服务框架在配置文件appsettings.json中配置一下领事的属性{"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warning&quo......
  • 第三章 右线性文法和有限自动机
    右线性文法和有限自动机目录右线性文法和有限自动机有限状态系统的概念有限自动机的概念确定有限自动机不确定有限自动机NFA和DFA的等价性有限状态系统的概念状态:状态是可以将事物区分开的一种标识离散状态系统:状态数有限,不能连续变化连续状态系统:状态可以连续变化,状态数......
  • JDK、maven、git、Jenkins搭建自动化测试环境(安装、打包、发布、部署)
    目录前言一、安装jdk二、安装maven三、安装git四、安装jenkins五、访问jenkins 六、创建用户七、配置jenkins八、执行总结 前言服务器:CentOS7.964位jdk:1.8maven:3.9.1git:gitversion1.8.3.1jenkins:2.346.3一、安装jdk1、下载jdk的rpm安装包(根......
  • 生信流程全自动化方案
    分享一下当前接触和应用的生信流程自动化分析的实现经验一前言19年底刚到厦门的时候,接触了一家跟临床医院合作,提供罕见病基因检测服务的公司,生信主要对二代DNA杂交捕获的测序数据进行分析,人工操作步骤大致如下:拿到实验室做好的样本信息待测序公司返回数据后,需要第一时间进......