.NET 6 Minimal API 的经验分享

Minimal API 是 .NET 6 提供的最新功能 , 对比传统的 ASP.NET Core Web API 方式更加直接 , 你可以用几行代码编写好 REST API 。 没有了祖传的 Startup.cs 和 Controller ,通过简单的代码就可以完成 API 的开发。在第二阶段的 .NET 挑战赛中就以 .NET 6 中 的 Minimal API 作为学习的主线来完成相关的云原生应用。 有小伙伴问怎么可以用好 Minimal API ,如何去架构一个 Minimal API 的云原生解决方案 ,下面我和大家说说 。

再来认识一下 Minimal API

对比起传统的 Web API , Minimal API 取消了 Controller , 文件的组织方式更像 Node.js . 在以前要启动一个 Web API , .NET 对比起 JavaScript , Go , Rust , Python 等语言的 Web 框架还是相对复杂的。 .NET 团队希望通过 Minimal API 简化 .NET Web 框架 ,让开发者能在一个文件完成简单 API 构建。以下是一个最基本的 Minimal API 项目。

MapGet 是 EndpointRouteBuilderExtensions 类的扩展方法, 你可以看到它设定了路由规则后, 会传递一个委托参数 , 编译器会将它转换为 RequestDelegate ,通过它来取代 Controller 的工作。然后使用 app.Run() 方法来运行我们的 Minimal API 应用程序。
 

架构 .NET 6 Minimal API 项目

在传统的 Web API 通过 Controller ,针对不同的功能进行 CRUD 的开发, 但如果我们是 Minimal API 呢 , 要如何组织呢 ? 还有我们是否还能用 Repository Pattern 呢 ?

1. Controller 再见

假设我们要搭建一个关于课程信息的 API, 有课程基本信息(课程类型,课程列表)和选课信息(学生选课,每门课学生选课信息),如果从传统 Web API 你需要添加 CourseController 和 BookController 两个控制器,通过不同 Action 去对应相关路由 ,但对于 Minimal API 如果我们涉及很多的路由就会让我们的 Program.cs 文件过大,非常不好管理。那我们把功能点切分,或者说重新模拟 Controller 去划分还是非常好的。

如上图 ,是我画的一个图 ,通过把 Course 和 Book 划分为两个 Module , 在 Module 里都包含了路由的设置 。这个时候我们做一个接口 ,因为每个 Module 都需要包含添加路由的方法,所以把它做成一个接口 IBaseModule ,以后不同的 Module 都可以用 。

 如何添加进去 Program.cs ? 我们来用一个 IEndpointRouteBuilder 的扩展方法 ,把路由添加都归类进来

public static class ModuleExtensions
{public static void Routers(this IEndpointRouteBuilder builder){CourseModule courseModule = new CourseModule();BookModule bookModule = new BookModule();courseModule.AddModuleRoutes(builder);bookModule.AddModuleRoutes(builder);}
}

这里有一个技巧就是我们可以通过以下 typeof 找到继承于 IBaseModule 的 Module 并将它实例化后调用添加路由的方法。

    public static void Routers(this IEndpointRouteBuilder builder){var modules = typeof(IBaseModule).Assembly.GetTypes().Where(p => p.IsClass && p.IsAssignableTo(typeof(IBaseModule))).Select(Activator.CreateInstance).Cast<IBaseModule>();foreach(var module in modules){module.AddModuleRoutes(builder);}}

2. Repostitory 模式能延续吗 ?

这是毫无疑问可以继续使用。 通过 Repository 模式你不需要去关心你所使用的 ORM 是什么 , 与 ORM 的所有处理过程都在 Repository 层中处理掉 , 通过这样去减少耦合, 提供更好的可测试性。在微软文档中,有以下的比较

在 Minimal API 使用 Repository Pattern 在整体上和传统的 ASP.NET MVC 没有不同 ,这里是我用 Repository 模式架构的 Minimal API 的截图

 注意一点有人认为 Repository 模式有点过时 ,和过度架构 , 但我觉得还是非常有必要的,因为这样可以更好管理你的项目。

3. 依赖注入

依赖注入解决了应用程序如何独立于对象创建方式的问题。 当您需要可配置的应用程序单元测试时,这非常有用。 随着应用程序的规模和复杂性的增长,依赖注入可帮助您更轻松地更改应用程序。 在 ASP.NET Core 中有非常好用的依赖注入方式 , 这点在 Minimal API 也是。 由于我们针对功能模块去管理 ,所以在依赖注入时也可以针对模块功能去进行 。以下是我针对模块依赖注入的设计, 结合 Repository 模式以及上面提到的 ModuleExtension.cs 进行的调整 , 我也把关于数据连接公用的依赖注入也抽象了出来。

public static class ModuleExtensions
{static readonly List<IBaseModule> moduleList = new List<IBaseModule>(); private static IEnumerable<IBaseModule> GetModules(){var modules = typeof(IBaseModule).Assembly.GetTypes().Where(p => p.IsClass && p.IsAssignableTo(typeof(IBaseModule))).Select(Activator.CreateInstance).Cast<IBaseModule>();return modules;}public static void Routers(this IEndpointRouteBuilder builder){foreach(var module in moduleList){module.AddModuleRoutes(builder);}}public static void AddIoC(this IServiceCollection services){foreach(var module in GetModules()){module.AddModuleIoC(services);moduleList.Add(module);}}public static void AddGlobalConfig(this IServiceCollection services){services.AddScoped<CourseDataContext>();services.AddScoped<IUnitOfWork, UnitOfWork>();}}

 注意一些地方 , 虽然在 Minimal API 上 ,我们的依赖注入虽然把不同的Services 注册了单例给 RequestDelegate 所调用 , 但在作为参数传送时,要添加 [FromServices] 属性标签才有效 , 如下

app.MapGet("/Course/GetCourse" ,([FromServices] ICourseService courseService , int typeID)=> { return courseService.GetCourseList(typeID); });

Minimal API or Web API

在 ASP.NET Core 中开发 API 时,你 90% 都在使用 ASP.NET Core MVC。 而当你使用 ASP.NET Core MVC 架构 Web API 时 , 你会发现有点复杂 , 你需要符合 ASP.NET Core MVC 的所有要求 。 而 Minimal API 正好解决了这些问题 , 特别对于一些只做 API 或者 入门的开发者, 只需要简洁的代码就能完成类似 Node.js 一样的工作 。有人问我 Minimal API 会取代传统的 Web API 吗 ? 我可以告诉大家不会。还是那句话 , 选择符合项目需求的方法才是正道的。

小结

在云原生的年代 , Minimal API 是 .NET 的又一把利器 。 .NET 6 的 Minimal API 要用好 ,实际上还是用到不少旧知识,像 Module 的构建方式,我参考了开源的 Carter( GitHub - CarterCommunity/Carter: Carter is framework that is a thin layer of extension methods and functionality over ASP.NET Core allowing code to be more explicit and most importantly more enjoyable. ) , 像 Repository 模式还是没有变 ,当然还是那些熟悉的语法 C# , 这就是我们常说的 ”万变不离其中“ 。 Minimal API 不是要取代 Web API , 更多是给开发人员多一个选择 。作为 .NET 学习挑战赛知识点的补充 , 希望能给各位小伙伴更深刻了解 Minimal API 在实际应用场景的技巧 。本次的示例代码也放到我的 GitHub 上了 ,如果各位小伙伴感兴趣可以访问该链接获取完整的代码 GitHub - kinfey/MinimalAPIDemo 。

相关资源

  1. 学习 Minimal API , 请访问该链接 最小 API 概述 | Microsoft Docs

  2. 学习 Repository 模式 , 请访问该链接 在 MVC 应用程序中实现存储库和工作单元模式 ASP.NET 10 (9) | Microsoft Docs


---------------------
作者:kinfey
来源:CSDN
原文:https://blog.csdn.net/kinfey/article/details/124534359
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

JavaWeb之Filter过滤器

原本计划这一篇来总结JSP&#xff0c;由于JSP的内容比较多&#xff0c;又想着晚上跑跑步减减肥&#xff0c;所以今天先介绍Filter以及它的使用举例&#xff0c;这样的话还有些时间可以锻炼锻炼。言归正传&#xff0c;过滤器从字面理解她的话有拦网、过滤的功能&#xff0c;可以…

【ArcGIS微课1000例】0054:尺寸注记的创建与编辑

尺寸注记要素是一种特殊类型的文本,用于显示地图上的长度或距离,可以创建各种形状的尺寸注记要素,如对齐、简单对齐、水平线状、垂直线状和旋转线状等。 文章目录 一、创建尺寸注记1. 直接创建尺寸注记要素2. 通过已有尺寸注记要素创建二、编辑尺寸注记1. 删除尺寸注记要素2…

利用python实现批量查询ip地址归属地址

今天需要查询nginx访问的客户端ip是否和调度一样&#xff01;先是用shell把文件中的ip截取出来&#xff1a; python脚本如下&#xff1a;&#xff08;哈哈&#xff0c;新手写的很草率&#xff09;#!/usr/bin/env#-- coding: utf-8 - import jsonimport urllibimport socketimpo…

基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

堪比JMeter的.Net压测工具 - Crank 入门篇

1. 前言 Crank 是.NET 团队用来运行基准测试的基准测试基础架构&#xff0c;包括&#xff08;但不限于&#xff09;来自TechEmpower Web 框架基准测试的场景,是2021年.NET Conf 大会上介绍的一项新的项目&#xff0c;其前身是Benchmarks。 Crank目标之一是为开发人员提供一种工…

【GlobalMapper精品教程】016:按照指定字段批量生成不同用地类型的矢量图层

Globalmapper中可以很方便的根据指定的字段,对矢量数据进行批量提取,生成不同类型的多个矢量数据,本文以土地利用现状数据为例,基于DLMC,提取出不同用地类型的矢量图层。 参考阅读:【ArcGIS遇上Python】ArcGIS Python按照指定字段批量筛选不同类型的图斑(以土地利用数据…

javascript闭包—围观大神如何解释闭包

闭包的概念已经出来很长时间了&#xff0c;网上资源一大把&#xff0c;本着拿来主意的方法来看看。 这一篇文章 学习Javascript闭包&#xff08;Closure&#xff09; 是大神阮一峰的博文&#xff0c;作者循序渐进&#xff0c;讲的很透彻。下面一一剖析。 1.变量的作用域 变量的…

.NET 20周年专访 - 张善友:.NET 技术是如何赋能并改变世界的

点击蓝字关注我们今年是 .NET 发布20周年&#xff0c;值此20周年之际&#xff0c;微软 Reactor 特别策划了 .NET 20周年系列主题专访。我们邀请了数位中国 .NET 领域的技术专家以及社区名人&#xff0c;来聊聊他们与 .NET 的情缘、认识 .NET 的契机、选择 .NET 的理由&#xff…

【ArcGIS错误异常100问】之005:ArcGIS字段计算器python中文编码问题解决

问题描述&#xff1a; 现因工作的需要&#xff0c;对照2017最新版&#xff1a;《土地利用现状分类》&#xff08;GBT 21010-2017&#xff09;&#xff0c;需根据DLMC对DLBM进行批量修改&#xff0c;如旱地是0103&#xff0c;其他林地是0307等&#xff0c;共计19种用地类型。 问…

【ArcGIS微课1000例】0055:根据图层创建自定义图例符号案例教程

在利用ArcGIS作图时,有时候需要根据线状或面状图层自己的矢量形状去创建图例项目符号,本文讲解根据图层创建自定义图例符号。 本实验使用的数据为配套案例数据包中的0055.rar中的水库数据。 文章目录 1. 添加“新建图例图面形状”工具2. 根据图层形状创建符号3. 绘制形状符号…

真魔法!图形化管理 Kafka 超轻量的自动化工具

Kafka Magic[1] 是一个用于处理 Apache Kafka 集群的 GUI 工具。它可以查找和显示消息、在 Topic 之间转换和移动消息、查看和更新模式、管理 Topic 以及自动化复杂任务。Kafka Magic 通过方便的用户界面促进 Topic 管理、QA 和集成测试。Kafka Magic Community Edition 可免费…

【FME实战教程】001:FME2020中文安装图文教程(附安装包下载)

文章目录1. 安装license2. 安装FME Desktop3. 安装中文语言4. FME软件下载地址1. 安装license 打开软件安装包中的fme-flexnet-win-x64.msi&#xff0c;如下图所示&#xff1a; 点击Next。 点击Next。 单击install。 点击finish&#xff0c;完成。 &#xff08;1&#xff09;修…

算法导论 第三部分——基本数据结构——第14章:数据结构的扩张

本章通过扩张红黑树构造出两种数据结构&#xff1a;动态顺序统计和区间树。 1、动态顺序统计&#xff1a;查找倒数第i小的数据 复杂度为 lg(n) 为什么是扩张红黑树而不是搜索二叉树或者二叉树&#xff1f; 相对于搜索二叉树&#xff0c;红黑树的平衡性更好&#xff0c;高度在l…

/hgfs下无共享文件夹?/mnt下没有hgfs文件夹?vmhgfs-fuse:找不到命令?

前言&#xff1a;最近在使用linux的过程中&#xff0c;需要在宿主操作系统与客户操作系统间建立共享文件夹&#xff0c;遇到了些许问题&#xff0c;在网上参考了许多文章与各种尝试后&#xff0c;现得以解决&#xff0c;分享如下。1、系统环境&#xff1a;宿主操作系统&#xf…

GraphQL入门有

本文将从GraphQL是什么&#xff0c;为什么要使用GraphQL&#xff0c;使用GraphQL创建简单例子&#xff0c;以及GraphQL实战&#xff0c;四个方面对GraphQL进行阐述。说得不对的地方&#xff0c;希望大家指出斧正。 github项目地址&#xff1a;https://github.com/Charming2015/…

对话庄表伟:开源第一课

庄表伟目前就职于华为的开源管理中心。自2014年开源社成立之初&#xff0c;他便友情参与了开源社的筹办工作。2017年&#xff0c;开源社转型为完全由个人成员组成的组织&#xff0c;庄表伟就以个人身份加入了开源社。作为开源社理事&#xff0c;当被问到“为什么要参选”时&…

【FME实战教程】002:FME完美实现CAD数据转shp案例教程(以三调土地利用现状数据为例)

FME完美实现CAD数据转shp案例教程&#xff08;以三调土地利用数据为例&#xff09; 文章目录1. cad数据预览2. 转换过程3. shp数据预览1. cad数据预览 2. 转换过程 &#xff08;1&#xff09;打开FME Desktop2020中文软件&#xff0c;点击【新建】。 &#xff08;2&#xff09…

【GlobalMapper精品教程】017:KML generator快速将坐标转为KML文件

本文介绍KML generator软件,并快速将坐标转为KML文件的使用方法,并用globalmapper中打开kml文件加以验证。本专栏配套完整的案例数据包,请打开data017.rar获取软件及数据。 文章目录 1. KML文件介绍2. kml generator软件介绍2.1 单点KML制作2.2 Excel数据KML制作2.3 文本文件…

模型验证组件 FluentValidation

FluentValidation 是 .NET 下的模型验证组件&#xff0c;和 ASP.NET MVC 基于Attribute 声明式验证的不同处&#xff0c;其利用表达式语法链式编程&#xff0c;使得验证组件与实体分开。正如 FluentValidation 的 介绍&#xff1a; A small validation library for .NET that u…

第二届中国PWA开发者日

点击蓝字关注我们活动介绍为加速推动渐进式 Web 应用 (PWA) 在中国的发展&#xff0c;微软与英特尔携手举办“第二届中国 PWA 开发者日”。本次活动邀请一众业界大咖围绕 PWA 展开分享&#xff0c;探讨最新技术进展&#xff0c;及 PWA 生态的实践与落地。期待与您线上相聚。活动…