前言

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 自动打开调用一下接口测试即可

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

最后

实现这个需求其实很简单,重要的是怎么在项目中结合业务来实现一个垂直切分的架构,让 MinimalApis 不再分散,业务模块化管理,架构更容易维护才是我们要实现的目标。

以下是本文的完整 源代码

希望本文对大家有所帮助!!!

MinimalApis自动注册的更多相关文章

  1. 制作dll自动注册工具

    记录一个简单的dll自动注册工具制作:主要用到的是DllRegisterServer()方法,其实我们平常注册dll文件内部都会调用这个方法. 这里我就直接写在主程序里面了,需要注意的地方也直接在代码 ...

  2. pb自动注册ole控件

    方法一:  1.手工注册OCX控件 将该控件随程序一起发布,然后,将此文件拷到windows\system,或者直接放在本运行目录,然后执行dos命令,run( "regsvr32   *. ...

  3. C#实现Dll(OCX)控件自动注册的两种方法 网上找的 然后 自己试了试 还是可以用的

    尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通 ...

  4. 在 node.js 的 express web 框架中自动注册路由

    该方法主要是动态注册自己写的 router . 注册器 router 文件名为 loader.js  . var express = require('express'); var fs = requ ...

  5. .NET Core扩展IServiceCollection自动注册服务

    前言 在ASP.NET Core中使用依赖注入中使用很简单,只需在Startup类的ConfigureServices()方法中,通过IServiceCollection接口进行注入即可,其它的无需关 ...

  6. Unity3.0基于约定的自动注册机制

    前文<Unity2.0容器自动注册机制>中,介绍了如何在 Unity 2.0 版本中使用 Auto Registration 自动注册机制.在 Unity 3.0 版本中(2013年),新 ...

  7. Unity2.0容器自动注册机制

    现如今可能每个人都会在项目中使用着某种 IoC 容器,并且我们的意识中已经形成一些固定的使用模式,有时会很难想象如果没有 IoC 容器工作该怎么进展. IoC 容器通过某种特定设计的配置,用于在运行时 ...

  8. C++11实现一个自动注册的工厂

    实现动机 工厂方法是最简单地创建派生类对象的方法,也是很常用的,工厂方法内部使用switch-case根据不同的key去创建不同的派生类对象,下面是一个伪代码. Message* create(int ...

  9. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析

    作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  10. 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析

    作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...

随机推荐

  1. .NET周刊【1月第3期 2024-01-24】

    国内文章 .NET开源的简单.快速.强大的前后端分离后台权限管理系统 https://www.cnblogs.com/Can-daydayup/p/17980851 本文介绍了中台Admin,一款基于 ...

  2. Kubernetes 1.26.0实战:在本地配置k8s集群

    阶段一:开发环境及版本 以下环境均来自官网: 本地宿主机环境:Windows 10 21H2 64位 虚拟机软件:VMware workstation 15.5 pro 虚拟机镜像版本:ubuntu- ...

  3. CF1348

    传送门 A: 一个组 \(2^n+2^1+\dots+2^{\frac{n}{2}-1}\),另一个组剩下的. B: 考虑不停循环. 如果不同的数字超过 \(k\),无解. 否则先把原序列去重,然后把 ...

  4. java实现幂等性校验

    我们在做web应用的时候通常会遇到前端提交按钮重复点击的场景,在某些新增操作上就需要做幂等性限制来保证数据的可靠性.下面来用java aop实现幂等性校验. 一:首先我们需要一个自定义注解 packa ...

  5. Freaktab将于12月底关闭

    出过众多优秀固件的电视盒子论坛Freaktab, 将于2021年12月31日关闭 R.I.P

  6. Neutron详解

    一:简介     一.概述 1. 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要创建.修改和删除网络 ...

  7. Spring Boot图书管理系统项目实战-10.借还统计

    导航: pre:  9.归还图书 next:11.检索图书 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 bookStat. ...

  8. Jsp+Servlet实现文件上传下载(一)--文件上传

    文件上传和下载功能是Java Web必备技能,很实用. 本文使用的是Apache下的著名的文件上传组件 org.apache.commons.fileupload 实现 下面结合最近看到的一些资料以及 ...

  9. 我的小程序之旅八:基于weixin-java-mp实现微信公众号被动回复消息

    在微信里有这样一个公众号[华为运动健康],当点击最新排行的时候,公众号就会发送今天最新的运动步数给你.如下图: 这里有两种格式的消息 1.有头像框,有聊天框--普通消息 2.消息有样式.颜色等--模板 ...

  10. 【Android 逆向】【攻防世界】黑客精神

    1. apk 安装到手机,提示输入注册码 2. jadx打开apk MainActivity.java @Override // android.app.Activity public void on ...