MinimalApis自动注册
前言
在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自动注册的更多相关文章
- 制作dll自动注册工具
记录一个简单的dll自动注册工具制作:主要用到的是DllRegisterServer()方法,其实我们平常注册dll文件内部都会调用这个方法. 这里我就直接写在主程序里面了,需要注意的地方也直接在代码 ...
- pb自动注册ole控件
方法一: 1.手工注册OCX控件 将该控件随程序一起发布,然后,将此文件拷到windows\system,或者直接放在本运行目录,然后执行dos命令,run( "regsvr32 *. ...
- C#实现Dll(OCX)控件自动注册的两种方法 网上找的 然后 自己试了试 还是可以用的
尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通 ...
- 在 node.js 的 express web 框架中自动注册路由
该方法主要是动态注册自己写的 router . 注册器 router 文件名为 loader.js . var express = require('express'); var fs = requ ...
- .NET Core扩展IServiceCollection自动注册服务
前言 在ASP.NET Core中使用依赖注入中使用很简单,只需在Startup类的ConfigureServices()方法中,通过IServiceCollection接口进行注入即可,其它的无需关 ...
- Unity3.0基于约定的自动注册机制
前文<Unity2.0容器自动注册机制>中,介绍了如何在 Unity 2.0 版本中使用 Auto Registration 自动注册机制.在 Unity 3.0 版本中(2013年),新 ...
- Unity2.0容器自动注册机制
现如今可能每个人都会在项目中使用着某种 IoC 容器,并且我们的意识中已经形成一些固定的使用模式,有时会很难想象如果没有 IoC 容器工作该怎么进展. IoC 容器通过某种特定设计的配置,用于在运行时 ...
- C++11实现一个自动注册的工厂
实现动机 工厂方法是最简单地创建派生类对象的方法,也是很常用的,工厂方法内部使用switch-case根据不同的key去创建不同的派生类对象,下面是一个伪代码. Message* create(int ...
- 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析
作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...
随机推荐
- 遥感图像处理笔记之【Сrор field boundary detection: approaches and main challenges】
遥感图像处理学习(6) 前言 遥感系列第6篇.遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2023年12月16日 2024年1月24日搬运至本人博客园平台 文章标题:Сrор field b ...
- 零基础入门Vue之梦开始的地方——插值语法
一.Vue 我!作为初学者,既然要将Vue,那我一定要介绍一下他是什么?我们可以应用一下官方的话 vue的介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与 ...
- 神经网络优化篇:详解如何训练一个 Softmax 分类器(Training a Softmax classifier)
如何训练一个 Softmax 分类器 回忆一下之前举的的例子,输出层计算出的\(z^{[l]}\)如下,\(z^{[l]} = \begin{bmatrix} 5 \\ 2 \\ - 1 \\ 3 \ ...
- 【Java并发入门】01 并发编程Bug的源头
一.根本原因 「CPU.内存.磁盘之间的速度差异」 为了能同时执行多个任务,CPU 发展出时间片轮转.多核等 CPU 要从内存中读数据太慢了,所以给自己设置了缓存 CPU 读磁盘更慢了,所以可以让该线 ...
- 洛谷P3046 海底高铁 巧用差分统计经过区间次数
洛谷P3046 海底高铁 -差分统计经过区间次数 题目贴在这里P3406 海底高铁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 分析 本题题干很长,但是题意理解很简单.就是给定n ...
- 21.1 TLS简述--《Windows核心编程》
一.TLS简述 我们知道在一个进程中,所有线程是共享同一个地址空间的.所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线程对其进行了修改,也就会影响到其他所有的线程.不过 ...
- SP34020 ADAPET - Ada and Pet 题解
题目传送门 前置知识 前缀函数与 KMP 算法 解法 经检验 样例,我们发现 \(|S|k\) 并不是最优答案. 考虑利用 luogu P4391 [BOI2009] Radio Transmissi ...
- 扯淡的DevOps,我们开发根本不想做运维!
引言 最初考虑引用" DevOps 已死,平台工程才是未来"作为标题,但这样的表达可能太过于绝对.最终,决定用了"扯淡的"这个词来描述 DevOps,但这并不是 ...
- NC51178 没有上司的舞会
题目链接 题目 题目描述 Ural大学有N名职员,编号为1~N. 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司. 每个职员有一个快乐指数,用整数 \(Hi\) 给出,其中 \(1\le ...
- 问题解决:Ubuntu18.04显示器分辨率不正常
在Ubuntu18.04下出现显示器分辨率不正确的情况,只能选择1024x768的分辨率,没有其它选项,显示器本身可以支持1920x1080的分辨率.经查询,采用cvt, xrandr的方法不成功,显 ...