文件|通俗理解.NET 6 Minimal APIs
点击上方蓝字
关注我们
(本文阅读时间:9分钟)
.NET 6 , 微软称为“最快的.NET” , 带有了许多令人兴奋的新功能、语言和性能改进 。 这是自 .NET Core 3.1 以来的第一个 LTS 版本 , 将支持三年 。 本次大版本发布 , 增加了一个新特性:Minimal APIs , 这是什么技术?
.NET6 使编写具有最小依赖性的 REST API 变得非常简单 。
Minimal APIs 似乎是微软对 NodeJS(使用 ExpressJS)HTTP 服务器的回应 , 它提供了最小的 API 。 但是微软也对这项技术增加了几个关键词:
- LightWeight , Single file , Cloud Native API
- Low ceremony , Top-Level C# programs
- Easy to get started
- Path to MVC
今天 , 我们花点时间 , 研究并科普一下.NET 6 Minimal APIs 。
微软MVP实验室研究员
文章图片
周国庆
微软MVP ,专注于.NET技术的大规模、分布式互联网应用 , 超过13年的一线开发、运维经历 , 踩过无数坑的同时 , 积累了大量分布式系统高可用性架构设计经验 。 目前专注于.NET互联网技术平台的建设和混沌工程实践 。
先看一下.NET 6 Minimal APIs的示例代码
app.Run;
在上面的示例中 , app.MapGet 方法使用了内联 lambda 表达式 , 完成一个 Controller Action 的业务逻辑 , 真的是超简单 。
超简单完成一个 HTTP WebAPI 的定义:不再有 Startup.cs、API 控制器、额外依赖项等 。
只需要这 4 行代码即可生成以下输出:
探究一下这段代码背后的一些技术
上面的代码 , 微软官方文档上 , 建议大家使用VS2022 , 其实用VS Code也可以
Tutorial: Create a minimal web API with ASP.NET Core
但是本机得先安装.NET 6 SDK
安装完成后 , 打开VS Code , 新建终端 , 创建一个Web Project
文章图片
代码工程中 , 我们可以看到:
Program.cs这个类中没有using了 , 当然也没有main函数了 , 这里跟大家解释一下:
① .NET5 引入了Top-Level Class , 可以没有main函数 , 代码作为直接入口执行
② .NET 6 新增了一个很棒的新特性——“隐式全局使用”
自动生成不可见的 using 语句并在全局范围内声明它们 , 因此不必处理在每个文件中重复声明命名空间的混乱 。
我们打开MyMinimalAPI.csproj 看看里面的内容 , 有一个配置:
<ImplicitUsings>enable</ImplicitUsings>
文章图片
dotnet build 后 , 找到 obj/Debug/net6.0 文件夹以查看隐藏的自动生成文件 - [ProjectName].GlobalUsings.g.cs 。 使用一个单独的类来将所有 using 语句保存在一个地方 。
文章图片
这个功能 , 让我们不需要在每个文件中重复声明命名空间的 using 引用了 。 的确很方便、简单了 。
当然 , 如果不想使用此功能 , 可以禁用 .csproj 文件中的 ImplicitUsings 标志 。
在上面的示例中 , app.MapGet 方法使用了内联 lambda 表达式 。 同时还提供了:
app.MapPost
app.MapPut
app.MapDelete
接下来 , 我们用一个简单的示例 , 完成一个 demo 。
- Tutorial: Create a minimal web API with ASP.NET Core
我们以一个简单 Order 订单为例 , 通过 Minimal APIs 实现 CRUD 设计和实现:
▌先准备好 Order 类和 IOrderService 接口以及 OrderServiceRepository
Order 类:
public string CustomAddress {get;set;}
public int State{get;set;}}}
IOrderService 接口:
voidDeleteOrder( intid ) ;
voidUpdateOrder( Order order) ; }}
OrderServiceRepository 类 , 使用内存集合模拟实现数据存储层 。
publicvoidCreateOrder( Order order) {orders.Add(order);}
publicvoidDeleteOrder( intid ) {varorder = orders.FirstOrDefault(i=>i.ID == id); if(order!= null) orders.Remove(order);}
publicvoidUpdateOrder( Order order) {DeleteOrder(order.ID);CreateOrder(order);}}}
▌在 Program.cs 类中 , 注册 IOrderService 服务 , 添加 AddOrder 和 GetOrder Http Web API
文章图片
//registe IOrderService servicebuilder.Services.AddScoped<IOrderService, OrderServiceRepository>;
var app = builder.Build;
app.MapGet("/", => "Hello World!");
//add order save APIapp.MapPost("/add",(Order order,IOrderService service)=>{ service.CreateOrder(order);}).WithName("addorder");
//add order query APIapp.MapGet("/getorder",(int id, IOrderService service)=>{ return service.GetOrder(id);}).WithName("getorder");
app.Run;
上面的低码中 , 首先增加一个文件级别的 namespace , 这个地方为了和大家示意 Global Namespace 的区别
using NET6;
然后 , 在 ASP.NET DI 依赖注入框架中添加 IOrderService 服务:
这个代码中 , 我们看到保存订单方法有2个参数 , 一个是 Order , 另一个是 IOrderService , 第二个参数 , 原生支持依赖注入 , 不需要显式声明创建 。
类似的 , 继续添加查询订单 API 服务
在终端中输入 dotnet run 指令 , 启动运行调试
文章图片
调试这3个 API , 建议大家使用 PostMan 工具
先说一个小坑 , 一开始使用 PostMan 工具调试保存订单接口 , 将 order 显式地参数放到 Headers 中请求 , 结果一直不通:
文章图片
看了微软的示例文档后 , 建议直接将 order json 对象 , http 请求体中以 raw 的方式发起请求
文章图片
其他的 API 接口则没有这个问题:
以上是.NET 6 Minimal APIs 的一些简单介绍和实践 , 希望能帮助大家 。
微软最有价值专家(MVP)
微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项 。 29年来 , 世界各地的技术社区领导者 , 因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项 。
MVP是经过严格挑选的专家团队 , 他们代表着技术最精湛且最具智慧的人 , 是对社区投入极大的热情并乐于助人的专家 。 MVP致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人 , 并最大程度地帮助微软技术社区用户使用 Microsoft 技术 。
更多详情请登录官方网站:
https://mvp.microsoft.com/zh-cn
谢谢你读完了本文~相信你一定有一些感想、观点、问题想要表达 。 欢迎在评论区畅所欲言 , 期待听到你的“声音”哦!
同时 , 喜欢的内容也不要忘记转发给你的小伙伴们 , 谢谢你的支持!
关注微软中国MSDN
使用ASP.NET Core创建Minimal Web API教程
推荐阅读
- Google|美司法部指责Google试图向法院隐藏文件
- Switch|推出 5 年后,任天堂 Switch 终于增加文件夹功能
- 文件|《艾尔登法环》PC版被曝存在漏洞,黑客可使玩家陷入无限死亡循环
- 天眼|中国天眼这项重大发现,让我们更好理解宇宙起源 | 新京报专栏
- AI|AI靠语意理解把照片变抽象画:无需相应数据集 只画4笔也保留神韵
- Tencent|无需安装方便实用 微信网页版文件传输助手体验
- 警告!|新型LokiLocker勒索软件会擦除整个PC上的文件
- 源代码|以反战之名,向开源项目“投毒”?知名 NPM 包作者注入恶意代码,只为一个文件名
- 机器|荣登离散推理型阅读理解DROP榜首 京东云广泛助力产业AI实践
- 用户|Windows 11文件管理器中出现广告?微软回应只是手滑