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 ...
随机推荐
- Python通过SNMP监控网络设备
前段时间,为了实现自动化巡检,我开发了自动化巡检工具,由于我的系统设备版本比较多,所以我是分别开发的客户端程序,服务端使用dll文件与客户端通信,服务端的dll在与python通信,通过Python丰 ...
- 数据共享Manager(Python)
from multiprocessing import Process,Manager,Lock def change_dic(dic,lock): with lock: dic['count'] - ...
- ElasticSearch7.3学习(十七)----搜索结果字段解析及time_out字段解析
1.搜索结果字段解析 首先插入一条测试数据 PUT /my_index/_doc/1 { "title": "2019-09-10" } 然后无条件搜索所有 G ...
- 针对SpringBoot服务端返回的空对象和空数组问题
返回的Json会自动过滤掉空指针的对象,但是若遇到非空指针的没有任何内容的对象,举例如下: public class Person { private String name; private Int ...
- [JVM] JVM的类加载机制
JVM的类加载 首先我们来看下Java虚拟机的类加载过程: 如上图. 当JVM需要用到某个类的时候,虚拟机会加载它的 .class 文件.加载了相关的字节码信息之后,会常见对应的 Class 对象,这 ...
- CORS就是跨域吗?
首先,跨域的域是什么? 跨域的英文是:Cross-Origin. Origin 中文含义为:起源,源头,出生地. 在跨域中,"域"指的是一个 Web 资源(比如网页.脚本.图片等) ...
- 通过weblogic发布服务器某个文件夹
介绍 客户有一台老服务器,上面安装的是weblogic,现在有个需求是需要将服务器下面某个文件夹下的文件都发布出来供某前端直接访问.之前都是直接利用tomcat的webapps目录直接发布即可,搜索了 ...
- 文心一言 VS 讯飞星火 VS chatgpt (199)-- 算法导论15.2 1题
一.用go语言,对矩阵规模序列(5,10,3,12,5,50,6),求矩阵链最优括号化方案. 文心一言,代码正常运行: 在Go语言中,为了找到矩阵链乘法的最优括号化方案,我们通常会使用动态规划(Dyn ...
- dllimport 和 dllexport
Dll 在需要暴露接口的头文件里添加 dllexport 声明,比如, #define DllExport __declspec( dllexport ) class DllExport C { in ...
- 使用Java线程同步工具类CyclicBarrier
如何使用 java.util.concurrent.CyclicBarrier是Java并发并发编程中的线程同步工具类,基于java.util.concurrent.locks.ReentrantLo ...