[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 交流 ~

Biwen.QuickApi代码生成器功能上线的更多相关文章

  1. 更新日志 - fir.im「高级统计」功能上线

    距离 2016 年到来只剩 10 个日夜,fir.im 也准备了一些新鲜的东西,比如「高级统计」功能和「跳转应用商店」功能,帮助你更好地管理.优化应用,欢迎大家试用反馈:) 新增高级统计功能 这次更新 ...

  2. Cloud Test 单页面即时监测功能上线!

    什么是即时监测? 即时监测,顾名思义是指输入 URL 后能够立即进行监测并展示结果,无需注册. 如下图,在输入框内输入需要监测的 URL,点击免费监测,即可展示网页监测结果: 图中我们可以看到页面各个 ...

  3. CI Weekly #16 | 从另一个角度看开发效率:flow.ci 数据统计功能上线

    很开心的告诉大家,flow.ci 数据统计功能已正式上线. 进入 flow.ci 控制台,点击「数据分析」按钮,你可以按照时间日期筛选,flow.ci 将多维度地展示「组织与项目」的构建数据指标与模型 ...

  4. 微信小程序又一爆炸功能上线-云开发

    云开发介绍 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云端能力. 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开 ...

  5. leangoo更换背景、设置颜色标签功能上线啦!

    leangoo看板背景太单调?卡片标签想要添加多个?没有问题,Leangoo的本次更新就给大家带来了漂亮背景和实用的颜色标签设置,接下来就让我们一起来看看吧! 设置背景: 点击看板右上角个人头像图标按 ...

  6. 把时间留给重要的事——Markdown 模板功能上线

    你是否遇到过因为同事在任务中过于放飞自我而感到头疼?或者经历过因为内容描写的不系统而导致关键信息被忽视? 现在,CODING Markdown 模板功能将帮助你解决这些困扰. 功能介绍 CODING ...

  7. SPSSAU新功能上线:高级公式、综合得分一键计算!

    一直关注我们的朋友们一定会发现,近期SPSSAU增添了很多新功能. 我们精挑细选出6个最常使用的功能,介绍给大家,看看这些新功能你有没有解锁成功呢? 01 一键删除无效样本 “无效样本”功能中,添加了 ...

  8. Java 开源办公开发平台 O2OA V5.4.0 发布 | 设计元素搜索功能上线

    O2OA V5.4.0版本此次更新的设计元素搜索功能,可以让用户在海量的脚本.页面.表单.视图等信息中迅速锁定有价值的信息,以便提高用户获取信息的效率.拥有此搜索功能后,在开发过程中,可以加速定位脚本 ...

  9. LightningChart JS 3.0 新功能上线

    在这次的LC JS更新中,首次将极坐标图引入图表库. 这种全新的图表类型可以通过API轻松地进行样式设置.极坐标可以用作独立图表或在仪表板中使用. 另外,用于 XY图表的对数轴也添加到了这次的更新,L ...

  10. XML代码生成器——XMLFACTORY 简介(一)

    XML代码生成器——XMLFACTORY 简介(一) 软件开发中经常要和第三方应用交互数据,特别是在银行.电信行业,这种需求更是必不可少,往往一个系统要和三五个其它系统交互数据,而数据交换的报文经常采 ...

随机推荐

  1. 18.详解AQS家族的成员:Semaphore

    关注:王有志,一个分享硬核Java技术的互金摸鱼侠. 欢迎你加入Java人的提桶跑路群:共同富裕的Java人 今天我们来聊一聊AQS家族中另一个重要成员Semaphore,我只收集到了一道关于Sema ...

  2. Python之Excel表格数据处理

    正式开讲之前,我们需要先了解几个基本的知识点:1.Python字典(Dictionary) 的setdefault()方法描述:如果键不存在于字典中,将会添加键并将值设为默认值.语法:dict.set ...

  3. C#.NET Framework RSA 私钥签名 公钥验签(验证签名) ver:20230612

    C#.NET Framework RSA 私钥签名 公钥验签(验证签名) ver:20230612 环境说明: .NET Framework 4.6 的控制台程序 . .NET Framework 对 ...

  4. 函数接口(Functional Interfaces)

    定义 首先,我们先看看函数接口在<Java语言规范>中是怎么定义的: 函数接口是一种只有一个抽象方法(除Object中的方法之外)的接口,因此代表一种单一函数契约.函数接口的抽象方法可以是 ...

  5. JWT解析详解

    JWT解析详解:> https://www.fke6.com/html/77107.html

  6. 详解共识算法的Raft算法模拟数

    摘要:Raft算法是一种分布式共识算法,用于解决分布式系统中的一致性问题. 本文分享自华为云社区<共识算法之Raft算法模拟数>,作者: TiAmoZhang . 01.Leader选举 ...

  7. 图像增强—自适应直方图均衡化(AHE)-限制对比度自适应直方图均衡(CLAHE)

    一.自适应直方图均衡化(Adaptive histgram equalization/AHE) 1.简述 自适应直方图均衡化(AHE)用来提升图像的对比度的一种计算机图像处理技术.和普通的直方图均衡算 ...

  8. Spring Cloud 之OpenFeign

    Spring Cloud 之OpenFeign 一:简介 ​ Feign是一个声明式(对比RestTemplate编程式)的服务客户端,即通过@FeignClient注解即可声明一个接口(interf ...

  9. MapReduce实现TopN的效果

    1.背景 最近在学习Hadoop的MapReduce,此处记录一下如何实现 TopN 的效果,以及在MapReduce中如何实现 自定义分组. 2.需求 我们有一份数据,数据中存在如下3个字段,订单编 ...

  10. .NET for Apache Spark 入门演练

    .NET for Apache Spark 入门演练 微软官方文档: .NET for Apache Spark 入门 | Microsoft Learn 注意:由于本次在windows平台下进行演练 ...