首页 > 其他分享 >Biwen.QuickApi代码生成器功能上线

Biwen.QuickApi代码生成器功能上线

时间:2023-09-27 17:22:44浏览次数:35  
标签:代码生成 return Biwen req result QuickApi var


[QuickApi("hello/world")]
public class MyApi : BaseQuickApi<Req,Rsp>{}

使用方式 :

 dotnet add package Biwen.QuickApi
 dotnet add package Biwen.QuickApi.SourceGenerator

最后简简单单注册路由:

app.MapGenQuickApis("api");

Biwen.QuickApi 使用REPR风格写的minimalApi已经写完了, 最近看到道友们都玩SourceGen提升代码性能
,所以一鼓作气 自己也实现了一个 Biwen.QuickApi的 代码生成器版本 用以替换 代码中反射和dynamic带来的性能问题

Biwen.QuickApi下面这一段核心代码:

            var req = await ((dynamic)api).ReqBinder.BindAsync(ctx.HttpContext!);
            //验证DTO
           if (req.RealValidator.Validate(req) is ValidationResult vresult && !vresult!.IsValid)
             {
                return Results.ValidationProblem(vresult.ToDictionary());
              }
            try
            {
                //var result = await method.Invoke(api, new object[] { req! })!;
                var result = await ((dynamic)api)!.ExecuteAsync(req!);
                if (result is EmptyResponse)
                {
                    return Results.Ok();
                }
                if (result is ContentResponse content)
                {
                    return Results.Content(content.Content);
                }
                Func<dynamic?, dynamic?> rspToExpandoObject = (rsp) =>
                {
                    if (rsp == null) return null;
                    var type = rsp.GetType() as Type;
                    var hasAlias = type!.GetProperties().Any(x => x.GetCustomAttribute<AliasAsAttribute>() != null);
                    if (!hasAlias)
                    {
                        return rsp;
                    }
                    dynamic expandoObject = new ExpandoObject();
                    foreach (var prop in type.GetProperties())
                    {
                        var alias = prop.GetCustomAttribute<AliasAsAttribute>();
                        ((IDictionary<string, object>)expandoObject)[alias != null ? alias.Name : prop.Name] = prop.GetValue(rsp);
                    }
                    return expandoObject;
                };
                var expandoResult = rspToExpandoObject(result);
                return Results.Json(expandoResult, quickApiOptions?.JsonSerializerOptions);
            }
            catch (Exception ex)
            {
                var exceptionHandlers = ctx.HttpContext!.RequestServices.GetServices<IQuickApiExceptionHandler>();
                //异常处理
                foreach (var handler in exceptionHandlers)
                {
                    await handler.HandleAsync(ex);
                }
                //默认处理
                throw;
            }

Biwen.QuickApi的原理就是反射查找所有标记[QuickApi]特征的Api,然后批量注册服务&批量映射路由. 路由请求执行的方法体使用了上面那一段可能性能堪忧的代码. 如果用Gen的方式那么 上面一段代码就都变成了强类型引用 生成如下的结果 :


//绑定对象
var req = await api.ReqBinder.BindAsync(ctx.HttpContext!);
//验证器
if (req.RealValidator.Validate(req) is ValidationResult vresult && !vresult!.IsValid)
{
	return Results.ValidationProblem(vresult.ToDictionary());
}
//执行请求
try
{
	var result = await api.ExecuteAsync(req!);
	return Results.Json(result);
}
catch (Exception ex)
{
	var exceptionHandlers = ctx.HttpContext!.RequestServices.GetServices<IQuickApiExceptionHandler>();
	//异常处理
	foreach (var handler in exceptionHandlers)
	{
		await handler.HandleAsync(ex);
	}
	//默认处理
	throw;
}
```这个就爽歪歪了 反射的问题没有了 动态类型也不见了 性能直接提升了 !

最后 Gen的实现代码可以翻看.
https://github.com/vipwan/Biwen.QuickApi 这里就不赘述了. 

欢迎 star 交流 ~ 

标签:代码生成,return,Biwen,req,result,QuickApi,var
From: https://www.cnblogs.com/vipwan/p/biwen-quickapi-gen.html

相关文章

  • MyCode代码生成器v1.0.0.2(BCB版)
    BCB开发管理系统之类的软件非常方便,而管理系统离不开数据库,对于我们开发人员而言,编写数据库操作代码比较繁琐,每次一个项目都得重新或大部分编写数据库操作代码,同时还得面对代码中可能存在的bug,有鉴于此,本人编写了MyCode-代码生成器,让我们一键生成对数据库操作的代码(cpp、h文件),直接......
  • 「开源系统」mybatis-plus代码生成工具(自己基于官方的封装的,打包成了maven插件的方式)
    mybatis-plus代码生成工具本工具基于MyBatis-Plus的代码生成器,MyBatis-Plus官网:https://baomidou.com/,请尊重原作者作品。demo:https://gitee.com/javalaoniu/mybatis-code-maven-plugin-demo插件:https://gitee.com/javalaoniu/mybatis-plus-code-maven-plugin生成的项目......
  • mybatisplus代码生成器 死活连接不上
    dburl改一下:jdbc:mysql://124.220.134.111:3306/content?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai    &useSSL=false一定要加这个鬼东西沃日......
  • dotnet 使用增量源代码生成技术的 Telescope 库导出程序集类型
    本文将告诉大家在dotnet里面使用免费完全开源的基于增量源代码生成技术的Telescope库,进行收集导出项目程序集里面指定类型。可以实现性能极高的指定类型收集,方便多模块对接入自己的业务框架此Telescope库是基于最友好的MIT协议开源的,免费开源可商用:https://github.com/do......
  • 中间代码生成
          ......
  • 我开发了一个代码生成工具,功能强大,宣传一下
    提升开发效率:CodeGenerator(代码生成工具)目前我自己每天用,开放免费给大家试用(使用)。 是时候提高编码效率、节省时间和降低开发成本了!现在,我们自豪地推出CodeGenerator(代码生成工具),一个能满足您各种开发需求的应用程序。立即点击链接 https://lbai.iclabs.cn/app......
  • 03.前后端分离中台框架 zhontai 项目代码生成器的使用
    合集-zhontai(3) 1.01.前后端分离中台框架后端Admin.Core学习-介绍与配置说明08-202.2.前后端分离中台框架前端admin.ui.plus学习-介绍与简单使用08-213.03.前后端分离中台框架zhontai项目代码生成器的使用08-22收起 zhontai项目基于.Net7.x+Vue等......
  • 微调llama2模型教程:创建自己的Python代码生成器
    本文将演示如何使用PEFT、QLoRa和Huggingface对新的lama-2进行微调,生成自己的代码生成器。所以本文将重点展示如何定制自己的llama2,进行快速训练,以完成特定任务。 https://avoid.overfit.cn/post/9794c9eef1df4e55adf514b3d727ee3b......
  • 扩展功能_代码生成器
            ......
  • 03.前后端分离中台框架 zhontai 项目代码生成器的使用
    zhontai项目基于.Net7.x+Vue等技术的前后端分离后台权限管理系统,想你所想的开发理念,希望减少工作量,帮助大家实现快速开发后端地址:https://github.com/zhontai/Admin.Core前端地址:https://github.com/zhontai/admin.ui.plus代码生成器:后端:https://github.com/share3......