最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球热讯: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>> GetListAsync(xxxDto input)    {        //控制器层什么都没有干,只是为了转发下业务层        return await _userAppService.GetListAsync(input);    }    //省略……}

​控制器只是做转发,其实啥都没干。举个例子:假设我们的系统中有几百张表,那么我基本就得建几百个控制器,但是这些控制器都没啥意义,为了不再做重复的事情,我们引入了MasaMinimalApi。让我们一起来看下:

  1. 第一步:在我们的Service层添加Masa.Contrib.Service.MinimalAPIsNuGet包,或者使用命令安装
dotnet add package Masa.Contrib.Service.MinimalAPIs
  1. 第二步:在Program.cs文件中添加以下代码
  1. 第三步:让Service层中的代码继承 ServiceBase
public class UserService : ServiceBase, IUserService{    public async Task GetUserNameAsync()    {        return "userName";    }}
  1. 最终效果:

Masa MinimalApi原理

​我们使用Masa MinimalApi最终也能达到Abp动态api的效果,而且性能更快,只需要引入一个包就行了。接下来我们来看下Masa MinimalApi内部是怎么实现的。下面进入我们的源码环节。

​MasaFramework中的minimalApi,会先从程序集中找到所有继承自ServiceBase的子类,遍历获取每个类中的方法,然后将方法封装成一个委托,并根据规则获取路由及http请求方法,最后调用微软官方的minimalApi方法MapMethods(这个方法最终也是转换成endpoint)。下面让我们来看下具体源码吧

1. AddMasaMinimalAPIs方法内部

AddMasaMinimalAPIs方法主要做三件事

  1. 添加全局路由配置
  2. 从程序集中找到所有继承自ServiceBase的类
  3. 把这些子类添加到容器中,以GlobalMinimalApiOptions静态类中

2. MapMasaMinimalAPIs方法内部

而MapMasaMinimalAPIs方法内部主要是

  1. 从遍历继承自ServiceBase的类,获取全局路由配置
  2. 调用ServiceBase类的AutoMapRoute方法
    1. 获取当前类中的方法
    2. 遍历得到的方法,组装一个委托,调用微软官方的MapMethods

总结

  1. Masa的MinimalApi最终还是调用微软官方的MapMethods方法映射成endpoint,只是在这上面加了一层ServiceBase。

  2. MasaMinimalApi能够减少我们程序中重复的代码,以及重复工作(PS:建控制器和转发业务层代码)

关键词: