ASP.NET Core奇淫技巧之动态WebApi的实现
一.前言
接触到动态WebApi(DynamicWebAPI)这个词的已有几年,是从ABP框架里面接触到的,当时便对ABP的这个技术很好奇,后面分析了一波,也尝试过从ABP剥离一个出来作为独立组件来使用,可是后来因与ABP依赖太多而放弃。十几天前朋友熊猫将这部分代码(我和他在搞事情)成功的从ABP中剥离出来并做了一个简单Demo扔给我,经过这么久(实在是太懒_)终于经过一些修改、添加功能、封装,现在已经能作为一个独立组件使用,项目开源在Github(https://github.com/dotnetauth/Panda.DynamicWebApi),希望觉得有用的朋友能给一个Star支持一下。
本文只讲使用,不讲原理,原理放到后面的文章中详细介绍。
二.介绍
不管是传统的三层架构、DDD经典四层架构(DDDLite),亦或是其他具有应用逻辑层(业务逻辑层)的架构,在Web应用程序开发当中,我们的业务逻辑最终都需要经过WebApi来进行调用,这里我们可能会有一个重复的操作:编写业务逻辑->编写API调用业务逻辑,这种重复性的操作有没有解决办法呢,我们编写完业务逻辑以后便给我们自动生成WebApi,答案当然是有的。
这里介绍一下本文的主角:Panda.DynamicWebApi(https://github.com/dotnetauth/Panda.DynamicWebApi)。源自于ABP的一个可独立使用的,可自动为你的业务逻辑层生成ASP.NETCoreWebApi层的开源组件。它生成的API符合Restful风格,可以根据符合条件的类来生成WebApi,由MVC框架直接调用逻辑,无性能问题,完美兼容Swagger来构建API说明文档。
三.使用
这里以DDD经典四层架构中的应用逻辑层来讲解。
1.准备
(1)建立两个项目一个是应用逻辑层类库项目;一个是作为生成WebApiHost,ASP.NETCoreWebApi项目
(2)编写应用逻辑
定义一个应用逻辑接口,所有应用逻辑都应实现它:
publicinterfaceIApplicationService { }
定义一个学生管理逻辑接口,继承应用逻辑接口
publicinterfaceIStudentAppService:IApplicationService { //////根据ID获取学生 /// ////// StudentOutputGet(intid); /// ///获取所有学生 /// ///List Get(); /// ///更新学生信息 /// ///voidUpdate(UpdateStudentInputinput); /// ///更新学生年龄 /// ///voidUpdateAge(intage); /// ///根据ID删除学生 /// ///voidDelete(intid); /// ///添加学生 /// ///voidCreate(CreateStudentInputinput); }
实现学生逻辑管理接口:
publicclassStudentAppService:IStudentAppService { //////根据ID获取学生 /// ////// [HttpGet("{id:int}")] publicStudentOutputGet(intid) { returnnewStudentOutput(){Id=1,Age=18,Name="张三"}; } /// ///获取所有学生 /// ///publicList Get() { returnnewList () { newStudentOutput(){Id=1,Age=18,Name="张三"}, newStudentOutput(){Id=2,Age=19,Name="李四"} }; } /// ///更新学生信息 /// ///publicvoidUpdate(UpdateStudentInputinput) { thrownewSystem.NotImplementedException(); } /// ///更新学生年龄 /// ///[HttpPatch("{id:int}/age")] publicvoidUpdateAge(intage) { thrownewSystem.NotImplementedException(); } /// ///根据ID删除学生 /// ///[HttpDelete("{id:int}")] publicvoidDelete(intid) { thrownewSystem.NotImplementedException(); } /// ///添加学生 /// ///publicvoidCreate(CreateStudentInputinput) { thrownewSystem.NotImplementedException(); } }
(3)给WebApiHost项目配置Swagger。
Install-PackageSwashbuckle.AspNetCore-Version4.0.1
Startup中配置
publicvoidConfigureServices(IServiceCollectionservices) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddSwaggerGen(options=> { options.SwaggerDoc("v1",newInfo{Title="晓晨学生管理系统WebApi",Version="v1"}); options.DocInclusionPredicate((docName,description)=>true); options.IncludeXmlComments(@"bin\Debug\netcoreapp2.2\Xc.StuMgr.WebApiHost.xml"); options.IncludeXmlComments(@"bin\Debug\netcoreapp2.2\Xc.StuMgr.Application.xml"); }); } publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv) { if(env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseSwagger(); app.UseSwaggerUI(c=> { c.SwaggerEndpoint("/swagger/v1/swagger.json","晓晨学生管理系统WebApi"); }); app.UseMvc(); }
运行则会直接看到默认的ValuesController的5个API。
2.动态WebApi
通过Nuget为Application项目安装组件:
Install-PackagePanda.DynamicWebApi
为接口IApplicationService继承IDynamicWebApi同时添加特性DynamicWebApi
[DynamicWebApi] publicinterfaceIApplicationService:IDynamicWebApi { }
在WebApiHost项目中,Startup里配置动态WebApi:
Startup.cs:
//添加动态WebApi需放在AddMvc之后 services.AddDynamicWebApi();
然后打开浏览器访问将会看到:
可以看到成功为我们的StudentAppService生成了WebApi,并且和Swagger完美兼容。
四.详细介绍
经过上面的介绍,大家应该可以看出使用是非常简单的,只需两步:
第一步:为你的类(或者该类的接口、该类继承的抽象类,不得放在该类除前面两种情况的父类上)继承IDynamicWebApi接口并加入特性[DynamicWebApi]
第二步:Startup中注册
//添加动态WebApi需放在AddMvc之后 services.AddDynamicWebApi();
因为需要MVC的一些类来进行处理,所以必须放在AddMvc之后,本组件有检查。
1.规则
本组件采用约定大于配置,所以在实际使用中有几个规则:
(1)要让类生成动态API需要满足两个条件,一个是该类直接或间接实现IDynamicWebApi,同时该类本身或者父抽象类或者实现的接口具有特性DynamicWebApi
(2)添加特性[NonDynamicWebApi]可使一个类或者一个方法不生成API,[NonDynamicWebApi]具有最高的优先级。
(3)会对符合规则的动态API类名进行后缀的删除,如:我们前面的StudentAppService,会被删除AppService后缀,这个规则是可以动态配置的。
(4)会自动添加API路由前缀,默认会为所有API添加api前缀
(5)默认的HTTP动词为POST,可以通过HttpGet/HttpPost/HttpDelete等等ASP.NETCore内置特性来覆盖
(6)可以通过HttpGet/HttpPost/HttpDelete等内置特性来覆盖默认路由
(7)默认会根据你的方法名字来设置HTTP动词,如CreateApple或者Create生成的API动词为POST,对照表如下,若命中(忽略大小写)对照表那么该API的名称中的这个动词将会被省略,如CreateApple将会变成Apple,如未在以下对照表中,将会使用默认动词POST
方法名开头
动词
create
POST
add
POST
post
POST
get
GET
find
GET
fetch
GET
query
GET
update
PUT
put
PUT
delete
DELETE
remove
DELETE
(8)强烈建议方法名称使用帕斯卡命名(PascalCase)规范,以更好的自动处理API名称,且使用以上对照表的动词。如:
添加苹果->Add/AddApple/Create/CreateApple
更新苹果->Update/UpdateApple
...
(9)[DynamicWebApi]特性因为可被继承,所以为了父类被误识别,禁止放在除抽象类、接口以外的父类上。
2.配置
所有的配置均在对象DynamicWebApiOptions中,说明如下:
五.疑难解答
若遇到问题,可使用Issues进行提问。
六.结束
本项目开源地址:https://github.com/dotnetauth/Panda.DynamicWebApi希望给个Star支持一下
本文Demo地址:XiaoChen.StudentManagement
ABP:https://github.com/aspnetboilerplate/aspnetboilerplate
到此这篇关于ASP.NETCore奇淫技巧之动态WebApi的实现的文章就介绍到这了,更多相关ASP.NETCore动态WebApi内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
作者:晓晨Master
文章链接:https://www.cnblogs.com/stulzq/p/11007770.html
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。