快速部署业务类为webapi服务
接着前一篇博文,将接口快速打包固定请求格式,不需要修改代码,可以自动完成接口调用,实际上就是生成了一个接口的代理类。
那么仅仅是接口请求代理,没有服务端怎么行?所以需要将实现接口的类部署为webapi的控制器。
这个时候ABP就登场了,原理需要查看官方文档。ABP就是实现了快速生成部署。
我就不说ABP的东西了,官方文档可以任意查阅。
因为ABP作为一种开源组件,集成的东西太多太全,作为小企业中的我们,复杂,不容易上手,所以打算跳过这个东西。
我需要的是把实现了业务接口的类部署成webapi即可,没有其它功用。
后面找到一个已经研究过的项目Dynamic Web AP。项目地址:https://github.com/dotnetauth/Panda.DynamicWebApi.git
作者博文地址:https://www.cnblogs.com/stulzq/p/11007770.html。
最近花时间看了看,其实就是asp中的AOP接口使用,只是我买平时开放用WebApi,没有采用。
研究了作者的东西,我感觉小项目是可以用的,原作者叫动态webapi,其实简单说就是webRPC.
我用netcore3用了下,有个别地方有差异。基本原理是合适的。
主要有2点:
1.根据自己的约定,设置某个类是控制器
2.根据判断的控制器类,按照aspnet core约束,修改其中的内容,让aspnet core将它认定为webapi.
这里我就不讲原作者的代码了,感兴趣的可以去看,我只讲我的,我们的差不多。
认定接口类是控制器的方法:
继承ControllerFeatureProvider类,该类就是mvc验证是控制器的类,里面有个方法IsController,返回true就表明当前类型是控制器。
我的代码中提供了配置,传入一个Fun类型委托,如果原来的判断不成功,就调用该委托,通过自定义方法检查是否是控制器。
注意:比较老版本该类是不能使用的,只能继承该类的实现接口,把源码抄过来。新版本才可以,把IsController方法修改成了虚拟方法。
修改约束的方法:
实现IApplicationModelConvention接口,逐步修改各级约束。其实按照aspnet core的使用。
就是按照信息处理。
最后创建的URL路由:api/域名称/控制器名称/方法名称。
里面的控制器名称可以设置,提供了配置方法。目前考虑不要侵入代码。
所以我的代码中提供配置,根据配置的名称分别查找控制器的常量,静态属性或者字段,获取值来设置控制器URL中的名称。
同理,版本信息,所属域都是这样。
简单的介绍就这样完了。
提供的建议:
如果你要按照这种解决方案,将实现接口的业务类快速部署,那么给一点点建议。
关于控制器名称,一种方式是固化格式,方便前端修改调用,例如,实现的业务类名称=接口名称+“Bil”,这样每个接口对应的控制器名称就有了。前端格式化实现请求就有路径了。另外可以在接口中添加常量,静态变量来设置,这样就符合后端实现了。
前端格式化实现时就可以反射获取接口中的值类设置URL.当前最后不要在业务接口中直接使用,而是让每一个业务接口都继承一个api的转用接口,在这个专用接口上面添加特性,常量,静态变量。这样就可以实现无代码侵入了。这部分工作在我的代码中没有,需要用户自己定义使用。ABP和原作者就是在代码中已经定义了,所以必须有特性或者类,而我的没有。这也是为什么他们需要添加特性或者继承,就是以此来判断控制器类或者名称,域的。
差不多了,慢慢看吧。
附带一点点说明:
netcore3有一些变化,把一些组件移除了,做第三方存在了,所以对应是有变化的。这里涉及的是JSON格式化,微软使用了自己定义的。System.Text.Json.而不是原来的第三方组件了。
所以Swagger也要使用最新的预览版,低版本报错。
我的示例用的是NSwag。使用NSwag.AspNetCore包。
最后说说我封装的库使用方法:
Startup中,
services.AddWebApiAssembly(null);//添加程序集
services.AddWebApiDirectory(null);//添加程序集目录
添加程序集,就是一般说的将控制器剥离的方式,内部封装了。
services.AddDynamicWebApi(new DynamicWebApiOptions() { ControllerFeature=(P)=> {
if (P.GetInterface(typeof(ICall).Name) == null)
{
return false;
}
return true;
} });
添加动态处理组件,就是封装整个过程的库,算是中间件吧。里面的ControllerFeature就是判断控制器的委托。
快速部署业务类为webapi服务的更多相关文章
- WebAPI 权限控制解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(三)
21.1 数据服务 21.1.1基本操作功能 Phenixヾ的数据服务,提供了如下的基本操作: 功能 Type URI 参数 完整获取实体集合对象 GET api/Data 分页获取实体集合对象 ...
- 快速部署ldap服务
快速部署ldap服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LDAP概述 .什么是目录服务 ()目录是一类为了浏览和搜索数据二十几的特殊的数据库,例如:最知名的的微软公 ...
- C#使用Owin技术部署轻量级webApi服务
写在前面: 除了使用IIS可以启用WebApi之外,微软还提供了Owin技术,免除了IIS繁琐的部署配置,只需要运行编写好的程序,即可启用webApi服务,是不是很爽呢? 对于Owin技术的详细介绍这 ...
- WebAPI 身份认证解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(一)
21 WebAPI服务 ASP.NET Web API,是微软在.NET Framework 4.5上推出的轻量级网络服务框架,虽然作为ASP.NET MVC 4的一部分,但却是一套全新的.独立的 ...
- Serverless Web Function 实践教程(一):快速部署 Node.js Web 服务
作为目前广受欢迎的 Web 服务开发语言,Node.js 提供了众多支持 HTTP 场景的相关功能,可以说是为 Web 构建而生.因此,基于 Node.js,也诞生了多种 Web 服务框架,它们对 N ...
- 部署基于JDK的webservice服务类
部署服务端 两个注解(@WebService @WebMethod).一个类(Endpoint) 首先新建JAVA工程ws-server 目录结构如下 在工程里新建一个接口,申明一个方法. packa ...
- Spring容器装饰者模式应用之实现业务类与服务类自由组合的解决方式
在不论什么一个项目中都不可或缺的存在两种bean,一种是实现系统核心功能的bean,我们称之为业务类,第二种是与系统核心业务无关但同一时候又提供十分重要服务bean,我们称之为服务类.业务类的bean ...
- 工程师技术(三):独立Web站点的快速部署、虚拟Web主机的部署、配置网页内容访问、使用自定Web根目录、配置安全Web服务、部署并测试WSGI站点
一.独立Web站点的快速部署 目标: 本例要求为 http://server0.example.com 配置Web站点,要求如下: 1> 从http://classroom/pub/materi ...
- 以windows服务方式快速部署免安装版Postgres数据库
目录 以windows服务方式快速部署免安装版Postgres数据库 1.下载Postgresql数据库免安装包 2.安装环境准备及验证 解压文件 测试环境依赖 3.创建并初始化数据目录 创建数据目录 ...
随机推荐
- [POI2006]ORK-Ploughing(贪心,枚举)
[POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He can begi ...
- win7提示不是正版桌面变黑
1.以管理员身份运行cmd.exe 2.在该界面>后面输入SLMGR -REARM,大家注意下有个空格键 然后点击确定,重启电脑就OK了.
- CSS3 Animations
CSS Animations 是CSS的一个模块,它定义了如何用关键帧来随时间推移对CSS属性的值进行动画处理.关键帧动画的行为可以通过指定它们的持续时间,它们的重复次数以及它们如何重复来控制. an ...
- php7 mysqli_query返回1 , 但是更新失败
HTML中忘了传id
- 对https的研究
HTTPS简介 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP ...
- Sentinel 1.7.0 发布,支持 Envoy 集群流量控制
流控降级中间件Sentinel 1.7.0版本正式发布,引入了 Envoy 集群流量控制支持.properties 文件配置.Consul/Etcd/Spring Cloud Config 动态数据源 ...
- PHP中什么是数组
PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型. 此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集 ...
- 用树状数组写的最长上升子序列(友好城市),nlogn。
#include<iostream> #include<algorithm> #define maxn 100000 #define lb(x) x&-x using ...
- Python_006(is和==,小数据池)
一.is和==的区别 1.id()方法,可以查看一个变量的内存地址 lst = ["周杰伦", "燃哥"] lst1 = ["周杰伦", & ...
- mysql 1067 - Invalid default value for 'addtime'错误处理
错误描述 TABLE `bota_payment_closing` ( `id` int(11) NOT NULL AUTO_INCREMENT, `monthly` varchar(8) NOT N ...