首页 > 作文

使用.NET6实现动态API

更新时间:2023-04-04 04:30:54 阅读: 评论:0

目录
开发环境项目地址项目目标编码约定核心代码使用示例

apilite是基于.net6直接将rvice层生成动态api路由,可以不用添加controller,支持模块插件化,在项目开发中能够提高工作效率,降低代码量。

开发环境

.net sdk 6.0.100-rc.2.21505.57vs2022 preview 7.0

项目地址

github: https://github.com/known/apilite

项目目标

根据rvice动态生成api支持自定义路由模板(通过route特性定义)支持模块插件化支持不同模块,相同rvice名称的路由(命名空间需要有3级以上,例如:com.mod.xxx)自动根据方法名称判断请求方式,get开头的方法名为get请求,其他为post请求

编码约定

模块类库必须包含继承imodule接口的类需要生成api的rvice必须继承irvice接口get请求的方法必须以get开头

核心代码

主要是apifeatureprovider和apiconvention这两个自定义类来动态生成api,apifeatureprovider继承controllerfeatureprovider,覆写iscontroller方法,判断服务类型是否符合controller。apiconvention实现了iapplicationmodelconvention接口,实现动态添加action。下面是主要代码,完整代码请在github上下四级英语听力技巧载。

static class rviceextension{    internal static webapplicationbuilder addkapp(this webapplicationbuilder builder, action<appoption>? action = null)    {        var option = new appoption();        action?.invoke(option);        ...        adddynamicapi(mvcbuilder, option);//添加动态api        return builder;    }     private static void adddynamicapi(imvcbuilder builder, appoption option)    {        builder.configureapplicationpa关英语rtmanager(m =>        {            m.applicationparts.add(new asmblypart(typeof(irvice).asmbly));            foreach (var item in option.modules)            {                item.initialize();//初始化模块                //将模块添加到applicationparts,这样才能发现服务类                var asmbly 怎么报志愿= item.gettype().asmbly;                m.applicationparts.add(new asmblypart(asmbly));            }            m.featureproviders.add(new apifeatureprovider());        });         builder.rvices.configure<mvcoptions>(o =>        {            o.conventions.add(new apiconvention());        });    }} //判断服务类型是否为controllerclass apifeatureprovider : controllerfeatureprovider{    protected override bool iscontroller(typeinfo typeinfo)    {        if (!typeof(irvice).isassignablefrom(typeinfo) ||            !typeinfo.ispublic ||            typeinfo.isabstract ||            typeinfo.isgenerictype)            return fal;         return true;    }} class apiconvention : iapplicationmodelconvention{    public void apply(applicationmodel application)    {        foreach (var controller in application.controllers)        {            var type = controller.controllertype;            if (typeof(irvice).isassignablefrom(type))            {                configureapiexplorer(controller);                configurelector(control抢的成语ler);            }        }    }     ...     //构造路由模板    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(namesill的比较级和最高级[^2]);        }         // controller        var controllername = action.controller.controllername;        if (controllername.endswith("rvice"))            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 testrvice : irvice{    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;    }}

以上所述是www.887551.com给大家介绍的使用.net6实现动态api,希望对大家有所帮助。在此也非常感谢大家对www.887551.com网站的支持!

本文发布于:2023-04-04 04:30:51,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/ed14805766f9de7440f6f23bc67843fd.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:使用.NET6实现动态API.doc

本文 PDF 下载地址:使用.NET6实现动态API.pdf

下一篇:返回列表
标签:模块   路由   动态   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图