如何使用.NET6实现动态API
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,本篇文章为大家展示了如何使用.NET6实现动态API,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ApiLite是基于.NET6直接将Service层生成动态
千家信息网最后更新 2025年11月15日如何使用.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安全错误
数据库的锁怎样保障安全
数据库查找数据的过程
该机不在服务器管理
寝室网络安全密钥是wifi
配置该服务器时对安全性
攒钱的软件开发
齐齐哈尔章鱼软件开发公司
中小企业管理软件开发公司
长沙医学院网络安全建设项目
安徽互联网展示科技馆设计
佛山软件开发外包
在线学习软件开发哪个培训平台好
激战2夏尔捏脸数据库
互联网科技公司如何运作
邮件地址用户名和服务器名
数据库查出来编码不对
如何解除网络安全限定
北京棋牌类软件开发
网络安全管理投票
绿茵信仰数据库
数据库中比较统计的函数
5g网络技术是事物说明文
中兴服务器研发中心在哪
秒赞网用什么数据库类型
田新勇网络安全宣传周
ftp管理linux服务器
定制项目管理软件开发收费标准
泰安管理系统软件开发哪家靠谱
哪个数据库功能最强大
重庆软件开发前十名
东菱网络技术