【.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Text2sql的一些技巧

最近看到了一篇关于text2sql的文章,以及一些论文。对使用模型做text2sql给了一些不错的建议。 参考文章:24年大模型潜力方向:大浪淘沙后的Text-to-SQL和Agent - 知乎 论文:https://arxiv.org/pdf/2403.09732.pdf 关于模型的建议 …

Linux modinfo命令教程:深入理解Linux内核模块(附案例详解和注意事项)

Linux modinfo命令介绍 modinfo(模块信息)命令在Linux系统中用于显示Linux内核模块的信息。此命令从命令行给出的Linux内核模块中提取信息。如果模块名称不是文件名,则默认搜索/lib/modules/kernel-version目录。modinfo可以理解来自任何Lin…

Stm32-hal库串口教程

工程是在上一节的LED的基础上修改的。 串口原理图 串口配置 led参考 CubelMX点灯-CSDN博客https://blog.csdn.net/anlog/article/details/137830323生成工程 编写包含文件 编写重定向代码 编写发送 编译下载 串口没有收到数据 查找原因 少配置了下图 再编译下载 收到数据…

mac安装nvm详细教程

0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…

Since Maven 3.8.1 http repositories are blocked.

编译maven 项目时候报错提示下面信息: Since Maven 3.8.1 http repositories are blocked.Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://XXXXXX:…

Java web应用性能分析之客户端慢

客户端慢的原因包括: 终端设备老化(手机、PAD、电脑年限久远、运行期间产生了很多垃圾未清除)终端网络设备老化(路由器、交换机老化)跟我们使用的手机一样,路由器也需要及时更新换代,否则硬件跟…

分布式限流——Redis + Lua脚本实现令牌桶算法

主要思路概括如下: 定义数据结构: 使用Redis存储令牌桶的状态,包括当前令牌数(KEYS[1])和上一次令牌填充的时间戳(KEYS[1]:last)。 计算新增令牌: 获取当前系统时间与上次令牌填充时…

信息系统项目管理师0053:设计和实施(4信息系统管理—4.1管理方法—4.1.3设计和实施)

点击查看专栏目录 文章目录 4.1.3设计和实施1.设计方法2.架构模式4.1.3设计和实施 开展信息系统设计和实施,首先需要将业务需求转换为信息系统架构,信息系统架构为将组织业务战略转换为信息系统的计划提供了蓝图。信息系统是支持组织中信息流动和处理的所有基础,包括硬件、软…

Ubuntu 18.04等 修改root的账号密码,删除root账号密码,并破解登陆密码!【需要有内核代码】

文章目录 1、命令总结2、已知账号的密码&#xff0c;能登陆Linux系统2.1、修改密码&#xff0c;使用 passwd <账号名> 命令2.2、删除密码&#xff0c;使用 passwd -d <账号名> 命令 3、未知账号的密码&#xff0c;不能登陆Linux系统&#xff08;并一定适用于大家&a…

前端请求发送成功,后端收到null

1、dishId为64&#xff0c;有数据 2、但是后端调试接不到数据&#xff0c;为null 3、形参部分缺少RequestBody接收JSON数据&#xff0c;加上即可

数据赋能(58)——要求:数据赋能实施部门能力

“要求&#xff1a;数据赋能实施部门能力”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据赋能实施部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据赋能实施部门应具备的关键能力如下。 理性思维与逻辑分…

网络协议——IS-IS协议详解

1. IS-IS是什么 IS-IS是一种基于链路状态并使用最短路径优先算法进行路由计算的一种IGP协议。IS-IS属于内部网关协议&#xff0c;用于自治系统内部。IS-IS是一种链路状态协议&#xff0c;使用最短路径优先算法进行路由计算。 2. 应用场景&#xff08;园区网和骨干网&#xff0…

Xamarin.Android中“ADB0020: Android ABI 不匹配。你正将应用支持的“armeabi-v7a;arm64-v8a”异常处理

这里写自定义目录标题 1、问题2、解决 1、问题 在Xamarin.Android中出现ADB0020: Android ABI 不匹配。你正将应用支持的“armeabi-v7a;arm64-v8a”ABI 部署到 ABI“x86_64;x86”的不兼容设备。应创建匹配其中一个应用 ABI 的仿真程序&#xff0c;或将“x86_64”添加到应用生成…

【独立全开源】点大商城V2-2.5.7 新增 快递查询AppCode自定义

独立全开源版本&#xff1a;点大商城V2小程序公众号模块&#xff0c;版本更新至2.5.7&#xff0c;前端为UNiapp、这个是源码后端开源&#xff0c;购买包更新&#xff0c;包修复、 更新为覆盖升级&#xff0c;源码更新了&#xff1a;新增 快递查询AppCode自定义 测试环境&#…

线程和进程的区别(面试)

线程和进程的区别 进程和线程的区别线程的优点 进程和线程的区别 1. 进程是系统进行资源分配和调度的一个独立单位,线程是程序执行的最小单位. 2. 进程有自己的内存地址空间,线程只独享指令流执行的必要资源,如寄存器和栈. 3. 由于同一进程的各线程共享内存和文件资源,可以不通…

手撸词法分析器(C/C++)

手撸词法分析器&#xff08;C/C&#xff09; 一.背景二.什么是词法分析器&#xff1f;三.代码四.思考 一.背景 这学期开设了编译原理&#xff0c;要求写个基本的词法分析器。所以博主就自己写了一份代码&#xff0c;也比较简单基础。 二.什么是词法分析器&#xff1f; 简单来…

Postman之接口测试

接口测试的必要条件 &#xff1a;请求方式、请求协议、请求地址、请求头、请求参数 常用请求方式 &#xff1a;Get请求&#xff08;get请求一般是获取数据&#xff09;、Post请求&#xff08;post请求一般是提交数据&#xff09; 传参格式 &#xff1a;表单提交、请求体提交 注…

什么是神经网络和机器学习?【云驻共创】

什么是神经网络和机器学习&#xff1f; 一.背景 在当今数字化浪潮中&#xff0c;神经网络和机器学习已成为科技领域的中流砥柱。它们作为人工智能的支柱&#xff0c;推动了自动化、智能化和数据驱动决策的进步。然而&#xff0c;对于初学者和专业人士来说&#xff0c;理解神经…

设计模式-构建者模式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS二次开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 定义 特点 使用场景 优缺点 (1) 优点 …

内网穿透部署流程

内网穿透 又称为NAT穿透&#xff0c;是一种技术手段&#xff0c;允许内网设备&#xff08;如运行在公司内部网络、家庭网络中的服务器、智能设备等&#xff09;的服务能够被外网用户访问。通常情况下&#xff0c;由于路由器、防火墙等设备的网络地址转换&#xff08;NAT&#x…