首页 > 其他分享 >NET.AutoApi原理揭秘

NET.AutoApi原理揭秘

时间:2023-01-15 01:44:15浏览次数:53  
标签:控制器 AutoApi ApplicationModel 集合 NET 揭秘 路由

前言

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

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

NET.AutoApi内部原理

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

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

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

其实NET.AutoApi 是基于 AspNet Mvc Core 的 builder.Services.AddControllers();app.MapControllers(); 去做的,微软留下了很多支持自定义扩展的地方,所以我们看下这两个方法中它干了些啥。注意:我这边只挑出NET.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内部,这个类内部包含了整个请求流程处理,感兴趣的朋友自己去看源码,我这就不绕进去了。

标签:控制器,AutoApi,ApplicationModel,集合,NET,揭秘,路由
From: https://www.cnblogs.com/norain/p/17052955.html

相关文章

  • Net 6 控制台配置文件读取
    原文网址:https://blog.csdn.net/shuikanshui/article/details/122809945一、使用App.Config作为配置文件1、项目增加应用程序配置文件App.config2、文件设置为“如果较......
  • NET.AutoApi 动态webapi接口,一个配置让你无需创建控制器类
    前言如果你的控制器代码像下面一样,只是对业务层做一层转发,那么能否将这个控制器“动态创建”,让开发只需要关注业务代码就行呢?答案是可以的。publicclassUserControll......
  • Kubernetes:通过轻量化工具 kubespy 实时观察YAML资源变更
    写在前面分享一个小工具​​kubespy​​给小伙伴博文内容涉及:工具的简单介绍下载安装以​​kubectl​​插件方式使用Demo理解不足小伙伴帮忙指正我所渴求的,無非是......
  • OS + Docker network calico / weave / flannel
    scalico,weave,flannel等开源网络组件 DockerWeaveNetworkhttps://www.cnblogs.com/xiangsikai/p/9900250.htmlWeaveNetwork:属于第三方网络项目。Weave在Docker主......
  • 【ASP.NET Core】按用户角色授权
    上次老周和大伙伴们分享了有关按用户Level授权的技巧,本文咱们聊聊以用户角色来授权的事。按用户角色授权其实更好弄,毕竟这个功能是内部集成的,多数场景下我们不需要扩展,不......
  • docker .net core3.1 Dockerfile
    安装步骤和core2.x一样看之前的随笔:Docker配置dotnetcore项目直接看DockerfileFROMmcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim#基础环境镜像WORKDIR......
  • 用Netty实现单机百万TCP长连接
    一、模拟单机连接瓶颈我们知道,通常启动一个服务端会绑定一个端口,例如8000端口,当然客户端连接端口是有限制的,除去最大端口65535和默认的1024端口及以下的端口,就只剩下1024~6......
  • Netty-核心模块组件-4
    Netty核心模块组件一、Bootstrap、ServerBootstrap1、Bootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件Netty......
  • 【论文导读】- SpreadGNN: Serverless Multi-task Federated Learning for Graph Neur
    文章目录​​论文信息​​​​摘要​​​​SpreadGNNFramework​​​​用于图层次学习的联邦图神经网络​​​​图神经网络的联邦多任务学习​​​​SpreadGNN​​​​DPA-......
  • linux中非root用户安装R:configure: WARNING: neither inconsolata.sty nor zi4.sty fo
     001、问题:configure:WARNING:neitherinconsolata.stynorzi4.styfound:PDFvignettesandpackagemanualswillnotberenderedoptimally  002、解决方......