ASP.NET Core奇淫技巧之动态WebApi的实现
副问题[/!--empirenews.page--]
打仗到动态WebApi(Dynamic Web API)这个词的已有几年,是从ABP框架内里打仗到的,其时便对ABP的这个技能很好奇,后头说明白一波,也实行过从ABP剥离一个出来作为独立组件来行使,然则其后因与ABP依靠太多而放弃。十几天前伴侣 熊猫 将这部门代码(我和他在搞工作)乐成的从 ABP 中剥离出来并做了一个简朴Demo扔给我,颠末这么久(其实是太懒_)终于颠末一些修改、添加成果、封装,此刻已经能作为一个独立组件行使,项目开源在Github(https://github.com/dotnetauth/Panda.DynamicWebApi),但愿认为有效的伴侣能给一个 Star 支持一下。 本文只讲行使,不讲道理,道理放到后头的文章中具体先容。 二.先容 不管是传统的三层架构、 DDD 经典四层架构(DDD Lite),亦或是其他具有应用逻辑层(营业逻辑层)的架构,在Web应用措施开拓傍边 ,我们的营业逻辑最终都必要颠末 Web Api 来举办挪用,这里我们也许会有一个一再的操纵:编写营业逻辑->编写API挪用营业逻辑,这种一再性的操纵有没有办理步伐呢,我们编写完营业逻辑往后便给我们自动天生WebApi,谜底虽然是有的。 这里先容一下本文的主角:Panda.DynamicWebApi(https://github.com/dotnetauth/Panda.DynamicWebApi)。源自于ABP的一个可独立行使的,可自动为你的营业逻辑层天生 ASP.NET Core WebApi 层的开源组件。它天生的API切合Restful气魄沤背同可以按照切合前提的类来天生WebApi,由MVC框架直接挪用逻辑,无机能题目,美满兼容Swagger来构建API声名文档。 三.行使 这里以 DDD 经典四层架构中的应用逻辑层来讲授。 1.筹备 (1)成立两个项目一个是应用逻辑层类库项目;一个是作为天生WebApi Host,ASP.NET Core WebApi项目 (2)编写应用逻辑 界说一个应用逻辑接口,全部应用逻辑都应实现它: public interface IApplicationService { } 界说一个门生打点逻辑接口,担任应用逻辑接口 public interface IStudentAppService : IApplicationService { /// <summary> /// 按照ID获取门生 /// </summary> /// <param></param> /// <returns></returns> StudentOutput Get(int id); /// <summary> /// 获取全部门生 /// </summary> /// <returns></returns> List<StudentOutput> Get(); /// <summary> /// 更新门生信息 /// </summary> /// <param></param> void Update(UpdateStudentInput input); /// <summary> /// 更新门生年数 /// </summary> /// <param></param> void UpdateAge(int age); /// <summary> /// 按照ID删除门生 /// </summary> /// <param></param> void Delete(int id); /// <summary> /// 添加门生 /// </summary> /// <param></param> void Create(CreateStudentInput input); } 实现门生逻辑打点接口: public class StudentAppService: IStudentAppService { /// <summary> /// 按照ID获取门生 /// </summary> /// <param></param> /// <returns></returns> [HttpGet("{id:int}")] public StudentOutput Get(int id) { return new StudentOutput() {Id = 1, Age = 18, Name = "张三"}; } /// <summary> /// 获取全部门生 /// </summary> /// <returns></returns> public List<StudentOutput> Get() { return new List<StudentOutput>() { new StudentOutput(){Id = 1,Age = 18,Name = "张三"}, new StudentOutput(){Id = 2,Age = 19,Name = "李四"} }; } /// <summary> /// 更新门生信息 /// </summary> /// <param></param> public void Update(UpdateStudentInput input) { throw new System.NotImplementedException(); } /// <summary> /// 更新门生年数 /// </summary> /// <param></param> [HttpPatch("{id:int}/age")] public void UpdateAge(int age) { throw new System.NotImplementedException(); } /// <summary> /// 按照ID删除门生 /// </summary> /// <param></param> [HttpDelete("{id:int}")] public void Delete(int id) { throw new System.NotImplementedException(); } /// <summary> /// 添加门生 /// </summary> /// <param></param> public void Create(CreateStudentInput input) { throw new System.NotImplementedException(); } } (3)给 WebApi Host 项目设置 Swagger。 Install-Package Swashbuckle.AspNetCore -Version 4.0.1 Startup 中设置 public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new Info { Title = "晓晨门生打点体系 WebApi", Version = "v1" }); options.DocInclusionPredicate((docName, description) => true); options.IncludeXmlComments(@"binDebugnetcoreapp2.2Xc.StuMgr.WebApiHost.xml"); options.IncludeXmlComments(@"binDebugnetcoreapp2.2Xc.StuMgr.Application.xml"); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { 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-Package Panda.DynamicWebApi 为接口 IApplicationService担任 IDynamicWebApi同时添加特征DynamicWebApi [DynamicWebApi] public interface IApplicationService:IDynamicWebApi { } 在 WebApi Host 项目中,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.NET Core 内置特征来包围 (6)可以通过HttpGet/HttpPost/HttpDelete 等内置特征来包围默认路由 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |