春风得意马蹄疾,一日看尽长安花!|

隔壁老黎

园龄:6年4个月粉丝:8关注:10

Cike.AutoApi原理揭秘

前言

上一篇文章我们讲了怎么使用 Cike.AutoApi 这个组件来动态生成webapi接口,让我们不需要创建控制器去转发业务层代码。这篇文章主要是讲解Cike.AutoApi 底层是怎么实现动态生成webapi接口

我们回顾下- Cike.AutoApi 最终的效果

Cike.AutoApi内部原理

其实Cike.AutoApi内部是借助于mvc抛出来的扩展,进行动态配置webapi的,主要有以下这么几个地方

  1. 将当前程序集添加进ApplicationPartManager类中的ApplicationParts集合中
  2. 增加ApplicationModelConvention处理ApplicationModel,动态增加路由特性等

Cike.AutoApi原理之源码浅析详解

其实Cike.AutoApi 是基于 AspNet Mvc Core 的 builder.Services.AddControllers();app.MapControllers(); 去做的,微软留下了很多支持自定义扩展的地方,所以我们看下这两个方法中它干了些啥。注意:我这边只挑出Cike.AutoApi中所用到的地方说,毕竟 mvc 的源码很长

builder.Services.AddControllers();

  1. 第一点,AddControllers内部会调用AddMvcCore。做的第一件事就是将当前启动程序集放到 ApplicationPartManager 类的ApplicationParts集合中

  1. 第二点:上图中的ConfigureDefaultFeatureProviders 方法,请记住ApplicationPartManager对象中的这个集合FeatureProviders,以及这个类ControllerFeatureProvider

    注意FeatureProviders集合以及ControllerFeatureProvider,这个ControllerFeatureProvider类的作用是:用于找出(过滤)程序集(ApplicationParts集合)中的控制器类(PS:那么我们只需要把我们的程序集添加到ApplicationParts集合中,然后增加一个FeatureProvider,可以将任何程序集中的类型,都添加为控制器类

  1. 第三点,添加一些若干服务注入,我这边只列举出我们所需的,大家有兴趣自己去看源码

    • MvcOptions:这个配置内有一个我们需要的东西,Conventions集合属性,

    这个IApplicationModelConvention 集合,可以对控制器类型和方法进行操作,赋予它路由及其它信息

  • services.TryAddSingleton():这个类很重要,它是将我们的控制器类型,转换成ApplicationModel 

ApplicationModel内包含了,每个控制器类的元属性(方法,路由信息、过滤器、特性标签等等),大家注意:这里会调用MvcOptions中的Conventions集合的Apply方法,我们可以自行添加Convention,这个时候可以将任何类都动态赋予路由等元属性,那么我们可以给一些原本不是控制器类型的类,添加路由信息,让他具备控制器的特性。

  • services.TryAddSingleton<IActionDescriptorCollectionProvider, DefaultActionDescriptorCollectionProvider>();Transient<IActionDescriptorProvider, ControllerActionDescriptorProvider>()

这个DefaultActionDescriptorCollectionProvider 的类做了两个事,

  1. 他会调用ApplicationModelFactory类的方法,将控制器类集合,转换成ApplicationModel。
  2. 然后又将ApplicationModel转换成ActionDescriptor集合

app.MapControllers();

  1. 开启一个订阅

  1. 将控制器方法,转换成Endpoint对象(内部是一个RequestDelegate)

  • ControllerActionInvoker内部,这个类内部包含了整个请求流程处理,感兴趣的朋友自己去看源码,我这就不绕进去了。

本文作者:隔壁老黎

本文链接:https://www.cnblogs.com/norain/p/17052955.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   隔壁老黎  阅读(311)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 一生等你 以冬
一生等你 - 以冬
00:00 / 00:00
An audio error has occurred.