如何使用.NET6实现动态API
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇文章为大家展示了如何使用.NET6实现动态API,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ApiLite是基于.NET6直接将Service层生成动态
千家信息网最后更新 2025年02月01日如何使用.NET6实现动态API
本篇文章为大家展示了如何使用.NET6实现动态API,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
ApiLite是基于.NET6直接将Service层生成动态api路由,可以不用添加Controller,支持模块插件化,在项目开发中能够提高工作效率,降低代码量。
开发环境
.NET SDK 6.0.100-rc.2.21505.57
VS2022 Preview 7.0
项目地址
GitHub: https://github.com/known/ApiLite
项目目标
根据Service动态生成api
支持自定义路由模板(通过Route特性定义)
支持模块插件化
支持不同模块,相同Service名称的路由(命名空间需要有3级以上,例如:Com.Mod.XXX)
自动根据方法名称判断请求方式,Get开头的方法名为GET请求,其他为POST请求
编码约定
模块类库必须包含继承IModule接口的类
需要生成api的Service必须继承IService接口
GET请求的方法必须以Get开头
核心代码
主要是ApiFeatureProvider和ApiConvention这两个自定义类来动态生成api,ApiFeatureProvider继承ControllerFeatureProvider,覆写IsController方法,判断服务类型是否符合Controller。ApiConvention实现了IApplicationModelConvention接口,实现动态添加Action。下面是主要代码,完整代码请在GitHub上下载。
static class ServiceExtension{ internal static WebApplicationBuilder AddKApp(this WebApplicationBuilder builder, Action? action = null) { var option = new AppOption(); action?.Invoke(option); ... AddDynamicApi(mvcBuilder, option);//添加动态api return builder; } private static void AddDynamicApi(IMvcBuilder builder, AppOption option) { builder.ConfigureApplicationPartManager(m => { m.ApplicationParts.Add(new AssemblyPart(typeof(IService).Assembly)); foreach (var item in option.Modules) { item.Initialize();//初始化模块 //将模块添加到ApplicationParts,这样才能发现服务类 var assembly = item.GetType().Assembly; m.ApplicationParts.Add(new AssemblyPart(assembly)); } m.FeatureProviders.Add(new ApiFeatureProvider()); }); builder.Services.Configure (o => { o.Conventions.Add(new ApiConvention()); }); }} //判断服务类型是否为Controllerclass ApiFeatureProvider : ControllerFeatureProvider{ protected override bool IsController(TypeInfo typeInfo) { if (!typeof(IService).IsAssignableFrom(typeInfo) || !typeInfo.IsPublic || typeInfo.IsAbstract || typeInfo.IsGenericType) return false; return true; }} class ApiConvention : IApplicationModelConvention{ public void Apply(ApplicationModel application) { foreach (var controller in application.Controllers) { var type = controller.ControllerType; if (typeof(IService).IsAssignableFrom(type)) { ConfigureApiExplorer(controller); ConfigureSelector(controller); } } } ... //构造路由模板 private string GetRouteTemplate(ActionModel action) { if (action.Attributes != null && action.Attributes.Count > 0) { foreach (var item in action.Attributes) { if (item is RouteAttribute attribute) { return attribute.Path;//返回自定义路由 } } } var routeTemplate = new StringBuilder(); //routeTemplate.Append("api"); var names = action.Controller.ControllerType.Namespace.Split('.'); if (names.Length > 2) { //支持不同模块相同类名,添加命名空间模块名作前缀 routeTemplate.Append(names[^2]); } // Controller var controllerName = action.Controller.ControllerName; if (controllerName.EndsWith("Service")) controllerName = controllerName[0..^7]; routeTemplate.Append($"/{controllerName}"); // Action var actionName = action.ActionName; if (actionName.EndsWith("Async")) actionName = actionName[..^"Async".Length]; if (!string.IsNullOrEmpty(actionName)) routeTemplate.Append($"/{actionName}"); return routeTemplate.ToString(); }}
使用示例
KHost.Run(args, o =>{ o.Modules.Add(new TestModule());//添加模块}); class TestModule : IModule{ public void Initialize() { }} public class TestService : IService{ public string GetName(string name) { return $"Hello {name}"; } public string SaveData(string data) { return $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} {data}"; } [Route("api/test")] public string GetCustMethod(string id) { return id; }}
上述内容就是如何使用.NET6实现动态API,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
模块
动态
路由
支持
代码
方法
生成
接口
项目
服务
不同
相同
内容
名称
开头
技能
插件
模板
知识
空间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
红帽杯网络安全攻防
巨亮引擎网络技术有限公司
处置来源于境内外的网络安全风险
网络安全法律法规宣贯主题
mysql数据库分数
qt应用软件开发入门
手机流量怎么一直无法连接服务器
之涯网络技术差
怎么给数据库表格重命名
人民法院网络安全培训
网站 数据库锁降级
车场检查大数据库
上海app软件开发价位
阳江无限软件开发零售价
阶段划分 软件开发
知道公司服务器ip地址怎么连
网络技术员证书图片
健康码运用了什么网络技术
2008 ftp 服务器
宿迁江苏高性能服务器高性价比
境外服务器经营备案
数据库中单价数据类型
四年级上册网络安全周手抄报
车场检查大数据库
中国网络安全排名
阶段划分 软件开发
计算机网络技术论文答辩问题
mc开服务器对电脑有损坏嘛
python串口软件开发
河南派时网络技术有限公司