Masa Framework源码解读-03 MasaMinimalApi设计
Posted 隔壁老黎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Masa Framework源码解读-03 MasaMinimalApi设计相关的知识,希望对你有一定的参考价值。
序言
相信大家可能或多或少都了解过微软官方的 MinimalApi
, 最开始刚出来那会我其实对 MinimalApi
是嗤之以鼻的,因为本身有Controller控制器能够明确定义请求方法出来,再者还有Abp
的动态webapi
珠玉在后。但是当我看了下masa的minimalApi之后,又改变了我对它的看法。
简介
Masa的Minimal Api是基于微软官方Minimal Api的基础上扩展的,使用 MasaMinimalApi
可以达到跟Abp的动态webapi
一样的效果,并且性能更高,更加简洁轻量。比较好的是MASA Framework的Minimal Api组件都可以单独使用,不像Abp
这个“老流氓”一样:使用任何一个组件都必须整个用abp框架。
MasaMinimalApi 示例
Demo项目下载地址:https://github.com/MapleWithoutWords/masa-demos 或者 https://gitee.com/fengwuyan/masa-demos
下面我将拿出我在小型项目中使用MasaMinimalApi的案例展现给大家。因为我们实际项目中很多的控制器都只是转发了服务层的代码,从而造成了大量“重复代码”,也带来了一些重复的工作。例如:
public class UserController:ControllerBase
private readonly IUserService _userService;
public UserController(IUserService userAppService) => _userService = userService;
[HttpGet]
public async Task<PageResult<List<xxxDto>>> GetListAsync(xxxDto input)
//控制器层什么都没有干,只是为了转发下业务层
return await _userAppService.GetListAsync(input);
//省略……
控制器只是做转发,其实啥都没干。举个例子:假设我们的系统中有几百张表,那么我基本就得建几百个控制器,但是这些控制器都没啥意义,为了不再做重复的事情,我们引入了MasaMinimalApi。让我们一起来看下:
- 第一步:在我们的Service层添加
Masa.Contrib.Service.MinimalAPIs
NuGet包,或者使用命令安装
dotnet add package Masa.Contrib.Service.MinimalAPIs
- 第二步:在Program.cs文件中添加以下代码
- 第三步:让Service层中的代码继承
ServiceBase
类
public class UserService : ServiceBase, IUserService
public async Task<string> GetUserNameAsync()
return "userName";
- 最终效果:
Masa MinimalApi原理
我们使用Masa MinimalApi
最终也能达到Abp动态api
的效果,而且性能更快,只需要引入一个包就行了。接下来我们来看下Masa MinimalApi
内部是怎么实现的。下面进入我们的源码环节。
MasaFramework中的minimalApi,会先从程序集中找到所有继承自ServiceBase的子类,遍历获取每个类中的方法,然后将方法封装成一个委托,并根据规则获取路由及http请求方法,最后调用微软官方的minimalApi方法MapMethods(这个方法最终也是转换成endpoint)。下面让我们来看下具体源码吧
1. AddMasaMinimalAPIs
方法内部
AddMasaMinimalAPIs方法主要做三件事
- 添加全局路由配置
- 从程序集中找到所有继承自
ServiceBase
的类 - 把这些子类添加到容器中,以
GlobalMinimalApiOptions
静态类中
2. MapMasaMinimalAPIs
方法内部
而MapMasaMinimalAPIs方法内部主要是
- 从遍历继承自
ServiceBase
的类,获取全局路由配置 - 调用
ServiceBase
类的AutoMapRoute方法- 获取当前类中的方法
- 遍历得到的方法,组装一个委托,调用微软官方的
MapMethods
总结
-
Masa的MinimalApi最终还是调用微软官方的MapMethods方法映射成endpoint,只是在这上面加了一层ServiceBase。
-
MasaMinimalApi能够减少我们程序中重复的代码,以及重复工作(PS:建控制器和转发业务层代码)
以上是关于Masa Framework源码解读-03 MasaMinimalApi设计的主要内容,如果未能解决你的问题,请参考以下文章