千家信息网

如何使用.NET6实现动态API

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章为大家展示了如何使用.NET6实现动态API,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ApiLite是基于.NET6直接将Service层生成动态
千家信息网最后更新 2026年11月03日如何使用.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安全错误 数据库的锁怎样保障安全 世界互联网领先科技成果 互联网科技论文 云电互联网科技 亿人帮互联网科技 互联网前沿科技 甘肃拓世互联网科技有限公司 博兴的互联网电子科技公司 云创客互联网科技公司 汽车互联网创新科技园 杭州壁岐互联网科技有限公司 苏州铭阳互联网科技有限公司 哈尔滨屹滨互联网科技有限公司 深圳市优智互联网科技有限公司 青海科技产业互联网发展 东莞新华互联网科技学校 华中科技大学互联网的牛人 小米互联网科技园入驻 互联网企业科技类企业如何做账 江苏互联网智能科技软件 云南互联网科技学费 上海挚品互联网科技有限公司 河南真二互联网科技有限公司 喔噻互联网科技 小马过河互联网科技 深圳艾佳互联网科技 互联网科技视频素材 互联网养老 桔豆科技 天速互联网络科技有限公司 广州慧亚互联网科技怎么样 绵阳真晨互联网科技有限公司
0