接着前一篇博文,将接口快速打包固定请求格式,不需要修改代码,可以自动完成接口调用,实际上就是生成了一个接口的代理类。

那么仅仅是接口请求代理,没有服务端怎么行?所以需要将实现接口的类部署为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服务的更多相关文章

  1. WebAPI 权限控制解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(三)

    21.1   数据服务 21.1.1基本操作功能 Phenixヾ的数据服务,提供了如下的基本操作: 功能 Type URI 参数 完整获取实体集合对象 GET api/Data 分页获取实体集合对象 ...

  2. 快速部署ldap服务

    快速部署ldap服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LDAP概述 .什么是目录服务 ()目录是一类为了浏览和搜索数据二十几的特殊的数据库,例如:最知名的的微软公 ...

  3. C#使用Owin技术部署轻量级webApi服务

    写在前面: 除了使用IIS可以启用WebApi之外,微软还提供了Owin技术,免除了IIS繁琐的部署配置,只需要运行编写好的程序,即可启用webApi服务,是不是很爽呢? 对于Owin技术的详细介绍这 ...

  4. WebAPI 身份认证解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(一)

    21   WebAPI服务 ASP.NET Web API,是微软在.NET Framework 4.5上推出的轻量级网络服务框架,虽然作为ASP.NET MVC 4的一部分,但却是一套全新的.独立的 ...

  5. Serverless Web Function 实践教程(一):快速部署 Node.js Web 服务

    作为目前广受欢迎的 Web 服务开发语言,Node.js 提供了众多支持 HTTP 场景的相关功能,可以说是为 Web 构建而生.因此,基于 Node.js,也诞生了多种 Web 服务框架,它们对 N ...

  6. 部署基于JDK的webservice服务类

    部署服务端 两个注解(@WebService @WebMethod).一个类(Endpoint) 首先新建JAVA工程ws-server 目录结构如下 在工程里新建一个接口,申明一个方法. packa ...

  7. Spring容器装饰者模式应用之实现业务类与服务类自由组合的解决方式

    在不论什么一个项目中都不可或缺的存在两种bean,一种是实现系统核心功能的bean,我们称之为业务类,第二种是与系统核心业务无关但同一时候又提供十分重要服务bean,我们称之为服务类.业务类的bean ...

  8. 工程师技术(三):独立Web站点的快速部署、虚拟Web主机的部署、配置网页内容访问、使用自定Web根目录、配置安全Web服务、部署并测试WSGI站点

    一.独立Web站点的快速部署 目标: 本例要求为 http://server0.example.com 配置Web站点,要求如下: 1> 从http://classroom/pub/materi ...

  9. 以windows服务方式快速部署免安装版Postgres数据库

    目录 以windows服务方式快速部署免安装版Postgres数据库 1.下载Postgresql数据库免安装包 2.安装环境准备及验证 解压文件 测试环境依赖 3.创建并初始化数据目录 创建数据目录 ...

随机推荐

  1. touch 创建空文件或改变文件的时间戳属性

    1.命令功能 touch 改变文件时间属性或创建空文件. 2.语法格式 touch  [option]  file touch 选项 文件名 3. 选项参数说明 参数 参数说明 -a 仅改变文件的访问 ...

  2. php array_diff()函数 语法

    php array_diff()函数 语法 作用:比较两个数组的键值,并返回差集.大理石平台价格表 语法:array_diff(array1,array2,array3...) 参数: 参数 描述 a ...

  3. Centos7卸载FastDFS6.1卸载(六)

    今天由于安装了高版本的fastdfs,与nginx不兼容,因此要卸载掉,重新安装. 转载:http://www.leftso.com/blog/244.html ) 停止服务 [root@bogon ...

  4. 【CF1253A】Single Push【模拟】

    题意:给你两个数组a,b,求是否存在操作使得a变成b,操作为选取一段子区间[l,r],选一个正整数k,使得ai+=k,i∈[l,r],只能操作一次 题解:模拟即可 #include<iostre ...

  5. Delphi实现获取磁盘空间大小的方法

    unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ...

  6. Linux下安装Tomcat(2)

    Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和 其它一些公司及个人共同开发而成.由于有了Sun的参与和支持,最新 ...

  7. ResquestInfoServlet类通过访问HttpServletRequest对象的各种方法来读取HTTP请求中的特定信息,并且把它们写入到HTML中

    ResquestInfoServlet类通过访问HttpServletRequest对象的各种方法来读取HTTP请求中的特定信息,并且把它们写入到HTML中 ResquestInfoServlet.j ...

  8. Sublime Text3 代码编辑器使用笔记

    Sublime Text3 作为一款代码的文本编辑器,有许多插件,这一点是我认为 Sublime Text3 很强大的原因之一.插件的安装可以参考下面的文章. Sublime Text3 插件安装教程 ...

  9. vue双向数据绑定v-model

    1.双向数据绑定 <input v-model="msg" /> <template> <div id="app"> < ...

  10. php匿名函数和闭包的理解

    PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包数其实是伪装成函数的对象. 匿名函数:就是没有名称的函数.匿名函数可以赋值给变量,对象传递.不过匿名函数仍是函数,因此可以调用,还可以传入参 ...