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

.NET 6 Minimal API 的经验分享相关推荐

  1. Azure 和Bing Maps API 示例经验分享

    [编者按]本文由微软一站式示例代码库团队撰写.微软一站式代码示例库(Microsoft All-In-OneCode Framework)是由微软提供的一站式的免费代码示例库.从这里可以免费获得所需的 ...

  2. 两个月入门深度学习,全靠动手实践!一位前端小哥的经验分享

    两个月入门深度学习,全靠动手实践!一位前端小哥的经验分享   在当前社会,技术日新月异,一个全栈工程师不及时学习新知识,掌握AI技能,再过两年就算不上"全栈"了. 产品发烧友.前端 ...

  3. Unity MMORPG游戏优化经验分享

    今天由Unity技术支持工程师高岩,根据实际的技术支持工作经验积累,分享如何对Unity MMORPG游戏进行优化. 在优化Unity游戏时,我们一般从四个方面:CPU.GPU.内存.工程配置等入手, ...

  4. .NET6中关于Minimal API的简单使用

    微信公众号:趣编程ACE 收集并分享日常的.NET实战开发技巧,源码获取关注后回复 源码; **如果觉得本公众号对您有帮助,欢迎关注 本文来自社区群粉丝投稿 .NET6中关于Minimal API的简 ...

  5. ASP.NET Core 6 Minimal API

    ASP.NET Core 6 Minimal API Intro 微软在 ASP.NET 6 Preview 4 的介绍文章中介绍了即将到来的 ASP.NET Core 6 中的最小 API 的雏形, ...

  6. 【Paddle 经验分享】利用PaddleHub 2.x 完成文本分类训练的坑

    CSDN原文链接:https://blog.csdn.net/kinfey/article/details/117254781 基于项目选择了PaddlePaddle 作为文本分类的基础,经过一周多的 ...

  7. Spring Cloud在云计算SaaS中的实战经验分享

    摘要 云帐房CTO张英磊基于自己的个人经验,分享Spring Cloud在云计算SaaS中的实战经验,希望能为大家带来一些思路上的帮助. 内容来源:2017年5月6日,云帐房CTO张英磊在" ...

  8. 云计算架构师分享:容器云在金融企业的落地方案 | 周末送资料(原题:某保险公司容器云PaaS平台建设实践经验分享)

    [摘要]随着技术和社区的成熟,容器.Kubernetes.微服务等新事物不再只是概念,已在很多企业落地并发挥了生产力,对容器和PaaS的需求也从试探性转向规模化推广和纵深探索,建设企业级容器PaaS平 ...

  9. 关于零基础学习web前端开发,有些过来经验分享

    大家好,今天给大家分享一下我从事WEB前行业一些自己的学习经验分享 也希望通过这篇文章,可以帮助到更多正在学习但是又不知道从哪里学习学习的前端的小伙伴,还有一些想要去转行的,但是不知道不知道如何去学习 ...

最新文章

  1. 《监控》再起风云,连同创作中的《监控2》成功牵手影视公司
  2. weblogic服务器部署的程序,如何直接通过IP访问(即URL中去掉工程名)
  3. 开启报名丨AutoML-Zero:从零开始搜索机器学习算法
  4. 世界上最伟大的10个公式,其中一个人尽皆知
  5. 她说要介绍10000个开源项目?来!我们一起监督!
  6. android:configChanges=keyboard|keyboardHidden|orientation|screenSize
  7. UVA11384正整数序列(把123..变成0的最小步数)
  8. MTK6589下传感器框架结构和代码分析以及传感器的参数指标
  9. SpringBoot的构造方法中使用@AutoWird注入的类会报错null
  10. 敏捷方法在测试计划中的应用
  11. Vue 3拖更,尤雨溪介绍最新进展
  12. 国内各大平台的推荐算法,看到360的时候笑喷了……
  13. 大楼通信综合布线系统_某办公大楼综合布线系统设计实例,小白可以借鉴一下,大神请绕路...
  14. mysql时间模糊查询_mysql中那些根据时间查询的sql语句
  15. 转 Procrastination
  16. Python深入06 Python的内存管理
  17. 安装 LaserJet 1020 时这个设备的驱动程序丢失了一个必需的项,这可能是由于 inf 是为 Windows 95 或更新版本而写的。联系您的硬件供应商。
  18. android 照片变油画,最近很火照片变油画Glaze软件
  19. 微信会员卡,信息类目字段跳转小程序【custom_field1】【巨巨巨巨坑】
  20. 使用Python来分离或者直接抓取pcap抓包文件中的HTTP流

热门文章

  1. RTX 3090 与 Tesla P40与 Tesla M40 深度学习训练速度比较
  2. 青春魅族为何一幅“龙钟老态”?
  3. Python爬虫-抓取PC端网易云音乐评论(GUI界面)
  4. 裸金属服务器内容讲解以及介绍
  5. 中层管理者课程设置背后的底层思维 | 眉州东坡实例解析
  6. 掘金茅台,三位投资客的暴富人生
  7. Programming Ruby 读书笔记(七)
  8. 如何制作表格(一)——TableLayout
  9. 全网最详细的深度学习pytorch-gpu环境配置
  10. 通过爬虫在GEO数据库上获取对应SRR号