apilite是基于.net6直接将rvice层生成动态api路由,可以不用添加controller,支持模块插件化,在项目开发中能够提高工作效率,降低代码量。
github: https://github.com/known/apilite
主要是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 条评论) |