如何更好地组织最小 WEB API 代码结构

前言

我们在《.NET 6新特性试用》中讲过,随着项目需求和复杂性的增加,单个文件的最小 WEB API 会变得非常臃肿。

而且,Program.cs 应该只放启动和初始化代码。不应该包含太多 MapXXX 方法。

那么,如何以更好的方式组织最小 WEB API 代码结构呢?

1. 静态帮助类

可以将它们移到单独的类中。

例如,你可以创建一个名为 MinimalApiHelper 的静态类并向其添加静态方法:

public static class MinimalApiHelper
{public static void RegisterWeatherForecastAPIs(WebApplication app){var summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};app.MapGet("/weatherforecast", () =>{......}).WithName("GetWeatherForecast");}
}

Program.cs 修改如下:

......app.UseHttpsRedirection();MinimalApiHelper.RegisterWeatherForecastAPIs(app);app.Run();

2. 扩展方法

更进一步,可以将这些静态方法创建为 WebApplication 类的扩展方法:

public static void RegisterWeatherForecastAPIs(this WebApplication app)
{......
}

可以像这样简化调用代码:

......app.RegisterWeatherForecastAPIs();app.Run();

3. 依赖注入

但是,存在大量服务时,需要多次执行注册代码:

app.RegisterService1APIs();
app.RegisterService2APIs();
......

我们可以使用依赖注入简化注册代码。

实现代码如下:

public  static class MinimalApiExtentions
{public static void AddMinimalApiRegisters(this IServiceCollection services, params Type[] types){var registers = new List<IMinimalApiRegister>();foreach (var type in types){registers.AddRange(type.Assembly.GetTypes().Where(x => typeof(IMinimalApiRegister).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract).Select(Activator.CreateInstance).Cast<IMinimalApiRegister>());}services.AddSingleton<IEnumerable<IMinimalApiRegister>>(registers);}public static void UseMinimalApiRegisters(this WebApplication app){var registers = app.Services.GetRequiredService<IEnumerable<IMinimalApiRegister>>();foreach (var register in registers){register.RegisterAPIs(app);}}
}

Program.cs 修改如下:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMinimalApiRegisters(typeof(Program));var app = builder.Build();
app.UseMinimalApiRegisters();
app.Run();

遍历程序集中的所有 IMinimalApiRegister 实现类,然后遍历调用实现类的 RegisterAPIs 方法。

示例实现类如下:

public class Service1Register : IMinimalApiRegister
{ public void RegisterAPIs(WebApplication app){app.MapGet("/", () => "Hello My IO");}
}

结论

今天,我们介绍了如何组织最小 WEB API 代码结构。

如果你有更好的方案,欢迎到我的公众号“My IO”留言讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言试题八十四之求空间两点之间的距离

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 定义一个表…

git分支进阶

其实git除了版本控制&#xff0c;另外一个最突出的特点就是他的分支操作。简直 丝滑~.git也是多人协作的必备武器。 通常我们正常情况下只需要master 和 develop分支就够了。 这里我们先以这两条分支作为基准&#xff0c;进行一系列的操作。 开发新功能流程 这个应该属于develo…

关于c# .net爬虫

刚开始听到爬虫这两个字眼的时候感觉挺稀奇的&#xff0c;之前并没有接触过爬虫&#xff0c;正好这会手上没事&#xff0c;于是便百度了一下。 1.网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&am…

Google 的 Java 编码规范,参考学习!

目录 01 术语说明和指南说明 02 源文件基础 2.1 文件名 2.2 文件编码&#xff1a;UTF-8 2.3 特殊字符 03 源文件结构 3.1 许可证或版权信息 3.2 package语句 3.3 import语句 3.4 类声明 04 格式 4.1 大括号 4.3 一行一个语句 4.4 列限制&#xff1a;80 或 100 4…

MySQL Schema与数据类型的优化

选择优化的数据类型&#xff1a; 1、 更小的通常更好&#xff1a; 一般情况下&#xff0c;应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快&#xff0c;因为他们占用更少的磁盘&#xff0c;内存和cpu缓存&#xff0c;并且处理时需要的cpu周期也更少。 2、…

【Pix4d精品教程】Pix4d中央子午线细化设置(测区跨两个分带)

《无人机航空摄影测量精品教程》合集目录(Pix4d、CC、EPS、PhotoScan、Inpho) 航测内业中,在自由空三结束之后,需要导入像控点,进而去刺像控点。但是当测区跨两个分带的时候(如测区正好处在3度带105和108中间),像控点可能距离靶标点很远,给刺点带来了很大难度。怎样解…

Failed:(13: Permission denied)导致访问浏览器出现Nginx 500 Internal Server Error

1 、问题 我在部署nginx反向代理服务器的时候&#xff0c;nginx.conf文件都配置好了&#xff0c;但是我在浏览器里面输入域名的时候&#xff0c;提示Nginx 500 Internal Server Error 2、分析 我们需要找到nginx输出错误日志的文件&#xff0c;在nginx.conf里面我们可以看到错…

MAUI与Blazor共享一套UI,媲美Flutter,实现Windows、macOS、Android、iOS、Web通用UI

1. 前言距离上次发《MAUI初体验&#xff1a;爽》一文已经过去2个月了&#xff0c;本计划是下半年或者明年再研究MAUI的&#xff0c;现在计划提前啦&#xff0c;因为我觉得MAUI Blazor挺有意思的&#xff1a;在Android、iOS、macOS、Windows之间共享UI&#xff0c;一处UI增加或者…

dns 报文格式

最近学习了下DNS的格式&#xff0c;发现很多内容都是转载自同一个而且说的不是很清楚&#xff0c;特再整理下具体可以查看RFC1035 http://www.ietf.org/rfc/rfc1035.txt有详细的解释对于英语理解不是很好和懒得看这么长的可以看下本文首先是DNS数据帧的格式-------------------…

input file实现批量上传

1、需求实现word批量上传。 2、使用插件jquery-form.js 3、html代码 注意 multiple"multiple" 1 <form id"frm_upload" method"post" enctype"multipart/form-data"> 2   <input type"file" id"filepath&qu…

【Pix4d精品教程】Pix4d修编正射影像DOM的两种方法案例详解

《无人机航空摄影测量精品教程》合集目录(Pix4d、CC、EPS、PhotoScan、Inpho) DOM修编前: DOM修编后: 文章摘要: Pix4d内业数据处理通常会生成点云、DSM和DOM等产品,DSM经过精编可以生成精准的DEM,而DOM一般情况下,存在比如房屋边缘被拉花,或者存在噪点的情况

删除Linux下/tmp目录引起的不正常登录系统

现象&#xff1a;/tmp占用400M的空间(里面全部是乱七八糟的东西) 动作&#xff1a;删除/tmp目录 后果&#xff1a;造成只能启动到控制台模式 应急&#xff1a; 1 创建目录&#xff1a;#mkdir /tmp 结果系统在控制台模式登录和X windows模式登录状态间反复切换&#xff0c;不能进…

C语言试题八十五之狼追兔子问题

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 一只兔子躲…

[转]快速使用FileProvider解决Android7.0文件权限问题

升级到Android7.0之后&#xff0c;启动系统相机或者截图&#xff0c;传入URI的时候可能会导致程序闪退崩溃。这是因为7.0的新的文件权限导致的。下面是解决这个问题的快速解决方案。 问题代码 在7.0可能会出问题的代码&#xff1a; final String CACHE_IMG Environment.getExt…

终于找到了,开源的Vue3+.NET6通用管理后台!

据说80%的.NET项目都是管理后台&#xff0c;然而能用上Vue3.NET6的管理后台并不多见。这里分享一套Vue3 Axios TS Vite ElementUI Plus .NET 6 WebAPI JWT SqlSugar的前后端分离架构的通用管理后台源码数据库脚本&#xff0c;还有与之配套录制的一组视频教程&#xff0c;全部打…

【Pix4d精品教程】Pix4d模型成果导出OSGB并加载OSGB到EPS进行三维测图完美案例教程

《无人机航空摄影测量精品教程》合集目录(Pix4d、CC、EPS、PhotoScan、Inpho) 在垂直摄影中,Pix4d也可以生成漂亮的三维模型,并导出为OSGB,加载到EPS进行三维测图。首先来看生成的三维格网纹理和EPS三维模型加载效果。 Pix4d生成的三维格网纹理: EPS加载OSGB模型效果: 文…

Vim 批量替换

假设在非Win系统下。 想批量替换文本不再是Ctrl&#xff0b;F那么简单了&#xff0c; 一般用Vim来做批量替换&#xff0c; 略微复杂点&#xff1a; 比如将192.168.0.1替换为192.168.0.2 :%s/192.168.0.1/192.168.0.2/g

Android实现ListView(1)

昨天有个朋友问我Android ListView列表视图&#xff0c;遇到了点错误&#xff0c;今天我给大家演示&#xff0c;具体实现见图&#xff1a; 1&#xff1a;创建一个item布局layout/item.xml 2&#xff1a;创建一个ListViewActivity类&#xff0c;但是必须继承ListActivity&#x…

WolframAlpha 的使用

WolframAlpha 1. 求解复杂方程组 ab−4abc2ac1直接点开网站&#xff0c;在输入框中输入&#xff0c;ab-4;abc2;ac1;&#xff08;逗号分割开来&#xff09;&#xff0c; 转载于:https://www.cnblogs.com/mtcnn/p/9423087.html

C语言试题八十六之兔子生兔子问题

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 假设一对兔…