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

这篇具有很好参考价值的文章主要介绍了Biwen.QuickApi代码生成器功能上线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


[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的方式那么 上面一段代码就都变成了强类型引用 生成如下的结果 :文章来源地址https://www.toymoban.com/news/detail-711843.html


//绑定对象
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 交流 ~ 

到了这里,关于Biwen.QuickApi代码生成器功能上线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 淘宝无痕下单生成器一拖多入口生成器(附api生成接口以代码)

    淘宝无痕下单生成器的用途是:通过无痕下单生成器生成的二维码,用户通过扫码直接无痕下单的,电商后台只显示成交,但是没有路径,什么都没有,没有痕迹,即使通过淘宝生意参谋流量路径、访客人数等数据都无法显示。可快速带动搜索权重,获得

    2024年02月12日
    浏览(129)
  • css在线代码生成器

    这里收集了许多有意思的css效果在线代码生成器适合每一位前端开发者 网格生成器https://cssgrid-generator.netlify.app/ CSS Grid Generator可帮助开发人员使用CSS Grid创建复杂的网格布局。网格布局是创建Web页面的灵活和响应式设计的强大方式。 布局生成器https://layout.bradwoods.io/ CSS布局生

    2024年02月14日
    浏览(66)
  • MyBatisPlus代码生成器使用

    无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小 :启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 强大的 CRUD 操作 :内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,

    2024年02月03日
    浏览(54)
  • 源生成器:根据需要自动生成机械重复代码

    本文概述了利用.NET Compiler Platform(“Roslyn”)SDK 附带的 源生成器 (Source Generator)自动生成机械重复的代码。关于这部分的基础入门知识可以在MSDN [1] 学到。 本文 默认 已经有一个解决方案,包含两个项目。一个是普通C#项目,依赖于另一个源生成器项目。 此处以 Dependenc

    2024年02月01日
    浏览(73)
  • 【若依】-代码生成器-微服务版本

    代码生成器可以快速的构建单表的CRUD操作,甚至提供了前端,可谓良心 说明:我默认你已经部署了微服务版本的若依项目,并将前后端已经运行 下面的内容是关于-单表CRUD-的代码生成器使用步骤 这里的表可以直接从若依的官网拿,改表名就可以,改一下表名,导入数据库

    2024年02月04日
    浏览(59)
  • C# 源代码生成器

    源生成器 是由 .NET Compiler Platform(“Roslyn”) SDK 附带。 通过源生成器,C# 开发人员可以在编译用户代码时检查用户代码。 生成器可以动态创建新的 C# 源文件,这些文件将添加到用户的编译中。 这样,代码可以在编译期间运行。 它会检查你的程序以生成与其余代码一起编译

    2024年02月04日
    浏览(44)
  • 若依笔记(四):代码生成器

    已知使用MyBatisPlus代码生成器可以自动生成Entity、Mapper、Service、Controller代码,前提是数据库中有数据表,生成pojo类以及对于该数据表的增删改查命令的代码,若依更进一步能选择表后生成代码、预览、下载,同时可以生产前端代码,与后端一起还能实现权限管理和数据隔离

    2024年02月06日
    浏览(49)
  • Java-代码生成器的实现

    最近看了一个开源的项目, jfinal-layui ,然后这个项目里面有一个 代码生成器 的功能 之前虽然有用过代码生成器,但是从来没有看过相关的源码,所以就研究了一下,个人感觉这个项目的代码生成器还是蛮好的,能够根据指定的数据库和表生成前后端的代码,不过这个项目

    2024年02月02日
    浏览(57)
  • 基于Velocity开发代码生成器

    一、引言 在项目开发中,我们有碰到大量的简单、重复的增删改查需求,通过阅读 若依 框架https://github.com/yangzongzhuan/RuoYi 的代码生成器实现,结合我项目所用的技术栈,开发出本项目的代码生成器。 二、Velocity 简单介绍 1、Velocity是一个基于Java的模板引擎,我们可以往C

    2024年02月15日
    浏览(57)
  • 又一款低代码生成器

    大家好,我是 Java陈序员 。 最近在浏览 Github 的时候,发现了一款简单好用的低代码生成器 maku-generator 。 无论是工作,还是接私活,这款低代码都能快速迭代出一个项目! 今天,分享给大家,强烈建议私有化部署! 关注微信公众号:【Java陈序员】,获取 开源项目分享、

    2024年04月10日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包