【.Net动态Web API】背景与实现原理
🚀前言
本文是《.Net Core进阶编程课程》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)
专栏介绍:通过源码实例来讲解Asp.Net Core进阶知识点,让大家完全掌握每一个知识点。
专栏适用于人群:Web后端开发人员
————————————————
本课程内容:
1、动态Web API背景
2、动态Web API实现原理
3、识别自定义控制器
一、动态Web API背景
一说到动态Web API,很多人都是因为使用ABP框架了解的。在讲解如何实现之前,我们了解下动态Web API的好处!
在DDD框架中,领域层和应用层是核心、所有业务处理与逻辑全部放在这两个层,而API层是只是薄薄的一层。
比如:DDD教程里的API代码,都是只有2行代码。
这样就存在2个问题:
1、每一个对外提供的API接口,我们都需要编写,这些都很机械化的代码。
2、EletricAuthorize权限验证,其实是属于应用层的,但这边被放在API层。
而通过动态Web API,可以减少代码量、提升工作效率等诸多好处。
二、动态Web API实现原理
2.1 应用程序部件
我们之所以可以实现动态Web API,要归功于Asp.net Core为我们提供的:应用程序部件。
在Asp.Net Core架构里,MVC控制器、视图组件、Razor Pages、Razor 视图、标记帮助程序(Tag Helpers)等都是一个独立的功能组件,它允许我们通过发现并加载应用程序中的特定功能组件。
比如:Web API只需加载MVC控制器、MVC架构的程序需要加载MVC控制器、视图组件。
比如官方文档里示例里,就是通过加载外部的DLL库,来加载控制器。
官方文档地址:https://learn.microsoft.com/zh-cn/aspnet/core/mvc/advanced/app-parts?view=aspnetcore-8.0
2.2 独立控制器项目示例
下面用一个示例来演示下,如何使用。
2.2.1 新建Web API项目
项目名称:Electric.DynamicWebAPI
为了后续方便调试:勾选启用OpenAPI,框架版本:这里选择.Net 7.0(这里可以根据需求自行选择)。
添加后的目录:
2.2.2 新建控制器项目
选择类库项目
项目名称:Electric.Controller
框架:.Net 7.0
添加后的目录:
2.2.3 新增控制器
在项目Electric.Controller,新增控制器:TestController。
TestController代码:
using Microsoft.AspNetCore.Mvc;namespace Electric.Controller
{[ApiController][Route("[controller]")]public class TestController : ControllerBase{[HttpGet]public string GetName(){return "GetName";}}
}
2.2.4 编译项目Electric.Controller
编译后把dll拷贝至 Electric.DynamicWebAPI项目bin目录下。
2.2.5 Electric.DynamicWebAPI加载控制器
在Program.cs加载程序集dll。
当然了,如果Electric.DynamicWebAPI如果引用了项目TestController,Asp.Net Core框架会默认扫描所有控制器,就不需要添加上面的代码。
//加载控制器var assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Electric.Controller.dll");builder.Services.AddControllers().AddApplicationPart(assembly);
2.2.6 运行项目
运行项目后,我们就可以看到控制器:TestController,已经被加载了。
2.3 ApplicationPartManager
通过官方文档和上面的演示,知道Asp.Net Core为我们提供了ApplicationPartManager,来方便我们根据需求来加载各种组件,比如控制器组件、视图组件等。
官方文档也告诉我们,通过AddApplicationPart和ConfigureApplicationPartManager,都可以实现加载组件。
3、识别自定义控制器
3.1 问题
看完上面的例子,可能会有很多人会产生一个问题:你定义的控制器,是继承了ControllerBase,Asp.Net Core可以自动识别,但是我们在DDD框架中,编写的可是应用服务,不会去继承ControllerBase。
3.2 检查应用程序部件
针对上面的问题,我们就需要用到:检查应用程序部件。
Asp.net Core也为我们提供了检查应用程序部件的方法,通过这些功能提供程序,我们就可以告诉
Asp.net Core哪一个是控制器。
3.3 ApplicationPartManager 定义
我们通过ApplicationPartManager的源码定义看,我们就可以很清楚的知道。
我们要实现动态API,只需两个步骤:
1、为ApplicationParts加载程序集资源;
2、为FeatureProviders添加检查应用程序部件的方法,告诉Asp.net Core哪一个是控制器。
四、最后
【.Net动态Web API】背景与实现原理就介绍到这边啦!
下一个课程讲解:如何实现动态控制器!
这个系列预计一天一篇文章,想要学习的可以关注起来!
文章会持续更新,大家有想要了解的功能点或者话题,可以在评论区告诉我!
【本课程源码下载链接】加我:xgbbwj
相关文章:

【.Net动态Web API】背景与实现原理
🚀前言 本文是《.Net Core进阶编程课程》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:通过源码实例来讲解Asp.Net Core进阶知识点,让大家完全掌握每一…...

JS-43-Node.js02-安装Node.js和npm
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,可以让JavaScript实现后端开发,所以,首先在本机安装Node.js环境。 一、安装Node.js 官网:下载 Node.js 默认两个版本的下载: 64位windows系统的LTS(Long Tim…...
设计模式(分类)
目录 设计模式(分类) 设计模式(六大原则) 设计模式是软件工程中一种经过验证的、用于解决特定设计问题的通用解决方案。它们是面向对象编程(Object-Oriented Programming, OOP)实践中提炼出的最佳实…...

请陪伴Kimi和GPT成长
经验的闪光汤圆 但是我想要写实的 你有吗? 岁数大了,希望如何学习新知识呢?又觉得自己哪些能力亟需补强呢? 看论文自然得用Kimi,主要是肝不动了,眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…...

优思学院|ISO45001职业健康安全管理体系是什么?
ISO45001:2018是新公布的国际标准规范,全球备受期待的职业健康与安全国际标准(OH&S)于2018年公布,并将在全球范围内改变工作场所实践。ISO45001将取代OHSAS18001,成为全球工作场所健康与安全的参考。 ISO45001:201…...

抖去推短视频矩阵系统----源头开发
为什么一直说让企业去做短视频矩阵?而好处就是有更多的流量入口,不同平台或账号之间可以进行资源互换,最终目的就是获客留咨,提单转化。你去看一些做得大的账号,你会发现他们在许多大的平台上,都有自己的账…...
Golang函数重试机制实现
前言 在编写应用程序时,有时候会遇到一些短暂的错误,例如网络请求、服务链接终端失败等,这些错误可能导致函数执行失败。 但是如果稍后执行可能会成功,那么在一些业务场景下就需要重试了,重试的概念很简单,…...

工业电脑在ESOP工作站行业应用
ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化,并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑,上层通过网络与MES系统连接,下层连接显示器展示作业指导书。ESOP控制终…...

java项目实战之图书管理系统(1)
✅作者简介:大家好,我是再无B~U~G,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 1.背景 图书管理系统是一种用于管理图书…...

3DGS渐进式渲染 - 离线生成渲染视频
总览 输入:环绕Object拍摄的RGB视频 输出:自定义相机路径的渲染视频(包含渐变效果) 实现过程 首先,编译3DGS的C代码,并跑通convert.py、train.py和render.py。教程如下: github网址…...

chromium 协议栈 cronet ios 踩坑案例
1、请求未携带 Accept-Language http header 出现图片加载失败 现象: 访问 https://www.huawei.com/cn/?ic_mediumdirect&ic_sourcesurlent 时出现图片加载失败的问题 预期结果: 原因: 网络库删除了添加 Accept-Language header 的逻…...
Java快速排序知识点(含面试大厂题和源码)
快速排序(Quick Sort)是一种高效的排序算法,采用分治法(Divide and Conquer)的策略来对一个数组进行排序。快速排序的平均时间复杂度为 O(n log n),在最坏的情况下为 O(n^2),但这种情况很少发生…...

SpringBoot整合Swagger2
SpringBoot整合Swagger2 1.什么是Swagger2?(应用场景)2.项目中如何使用2.1 导入依赖2.2 编写配置类2.3 注解使用2.3.1 controller注解:2.3.2 方法注解2.3.3 实体类注解2.3.4 方法返回值注解2.3.5 忽略的方法 3.UI界面 1.什么是Swa…...

C++算法题 - 矩阵
目录 36. 有效的数独54. 螺旋矩阵48. 旋转图像73. 矩阵置零289. 生命游戏 36. 有效的数独 LeetCode_link 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…...
记录一个没测出来,有点严重的Bug
前提: 人物:若干个 部门:若干个 部门有一个人物选择框,可以选择所有的人物,且为非必填字段 bug现象: 部门中 的人物选择框每次都少一个人物 代码分析: F12接口后端没问题,定位为前端的问题。 前…...

科学突破可能开创6G通信新时代
格拉斯哥大学开发的火柴盒大小的天线可以为全息通话、改进自动驾驶和更好的医疗保健的世界铺平道路。 格拉斯哥大学表示,这种创新的无线通信天线将超材料的独特特性与复杂的信号处理相结合,有助于构建未来的 6G 网络。 数字编码动态超表面天线…...

游戏、app抓包
文章目录 协议app抓包游戏抓包 协议 在抓包之前,首先我们要对每个程序使用什么协议有个大致的了解,比如网页这种就是走的http协议。 在一些app中我们通过发送一个请求,然后服务器接受,响应,返回一个数据包,…...

PACNet CellNet(代码开源)|bulk数据作细胞分类,评估细胞命运性能的一大利器
文章目录 1.前言2.CellNet2.1CellNet简介2.2CellNet结果 3.PACNet3.1安装R包与加载R包3.2加载数据3.3开始训练和分类3.4可视化分类过程3.5可视化分类结果 4.细胞命运分类和免疫浸润比较 1.前言 今天冲浪看到一个细胞分类性能评估的R包——PACNet,它与转录组分析方法…...
(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(定义属性)
第10章 属性和事件 在过去的三章中,我已经介绍了Object Pascal中面向对象编程(OOP)的基础知识,解释了这些概念并展示了大多数面向对象编程语言中通用特性是如何具体实现的。自Delphi的早期,Object Pascal语言就是一…...

【网络安全 | 密码学】JWT基础知识及攻击方式详析
前言 JWT(Json Web Token)是一种用于在网络应用之间安全地传输信息的开放标准。它通过将用户信息以JSON格式加密并封装在一个token中,然后将该token发送给服务端进行验证,从而实现身份验证和授权。 流程 JWT的加密和解密过程如…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...