無需編碼,自動實現“異步 Request-Reply”模式

前言

上次,我們雖然用代碼實現了“異步 Request-Reply 模式”,但是需要為每一個長時間操作 API 實現一個對應的 AsyncXXX 操作。

其實,可以嘗試用 Source Generators 減少這種重復性勞動。

實現思路

  • Controller 類必須是partial,這樣才能為它額外增加新方法;

  • 為每個長時間操作 API 聲明一個 AsyncMethodAttribute,這樣 Source Generators 才知道為誰實現對應的同步操作;

  • 遍歷所有聲明了 AsyncMethodAttribute 的方法,為其編寫實現方法。

具體代碼

1.添加 AsyncMethodAttribute

向待編譯項目加入 AsyncMethodAttribute 代碼:

const?string?asyncMethodAttributeText?=?@"using?System;namespace?AsyncMethodGenerator
{public?sealed?class?AsyncMethodAttribute?:?Attribute{public?AsyncMethodAttribute(){}}
}
";context.AddSource("AsyncMethodAttribute",?SourceText.From(asyncMethodAttributeText,?Encoding.UTF8));

2.遍歷 AsyncMethodAttribute 聲明方法

找到聲明了 AsyncMethodAttribute 的所有方法:

private?string?GenerateMethods(SyntaxList<MemberDeclarationSyntax>?members)
{StringBuilder?stringBuilder?=?new?StringBuilder();foreach?(var?member?in?members){if(member?is?MethodDeclarationSyntax?method?&&?HasAsyncMethodAttribute(method)){stringBuilder.Append(GenerateAsyncMethod(method));}}return?stringBuilder.ToString();
}private?bool?HasAsyncMethodAttribute(MethodDeclarationSyntax?method)
{var?hasAttribute?=?false;foreach?(var?attributeList?in?method.AttributeLists){foreach?(var?attribute?in?attributeList.Attributes){if?(attribute.Name.ToString().Equals("AsyncMethod")){hasAttribute?=?true;}}}return?hasAttribute;
}

3.生成 AsyncMethod 代碼

根據原方法定義,生成 AsyncMethod 方法:

private?string?GenerateAsyncMethod(MethodDeclarationSyntax?method)
{var?stringBuilder?=?new?StringBuilder();foreach?(var?attributeList?in?method.AttributeLists){foreach?(var?attribute?in?attributeList.Attributes){if?(attribute.Name.ToString().Equals("Route")){stringBuilder.Append($@"[Route(""async/{attribute.ArgumentList.Arguments[0].ToString().Trim('"')}"")]");}else{stringBuilder.Append($"[{attribute}]");stringBuilder.Append("\r\n");}}}stringBuilder.Append($"public?async?Task<IActionResult>?Async{method.Identifier}?");stringBuilder.Append($"({method.ParameterList.Parameters})");stringBuilder.Append("\r\n");stringBuilder.Append($@"{{string?id?=?Guid.NewGuid().ToString();string?responseValue?=??$@""/status/{{id}}"";_cache.SetString(id,?responseValue);Task.Factory.StartNew(()?=>{{var?result?=?{GenerateCallingMethod(method)}.Result;_cache.SetString(id?+?""_result"",?JsonConvert.SerializeObject(result));}});return?Accepted(responseValue);}}");return?stringBuilder.ToString();
}

4.使用

現在,就可以在目標項目中使用 AsyncMethod 方法了:

[ApiController]
[Route("[controller]")]
public?partial?class?WeatherForecastController?:?ControllerBase
{...[HttpGet][Route("get")][AsyncMethod]public?async?Task<IEnumerable<WeatherForecast>>?Get(){...}
}

注意 WeatherForecastController 是 partial class

結論

有了 Source Generators,可以讓編譯器幫我們自動實現“異步 Request-Reply 模式”了!

想了解更多內容,請關注我的個人公眾號”My IO“

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284503.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284503.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin Weekly 中文周報

Kotlin Weekly 中文周報 —— 25 Kotlin 開發中文周報 文章 使用 Kotlin 中的 takeIf &#xff08;zhuanlan.zhihu.com&#xff09; 在 Kotlin 的標準函數中有個 takeIf 函數&#xff0c;你是否了解這個函數呢&#xff1f;它是否只是漂亮點的 if 語句呢&#xff1f; Kotlin 的…

第一次玩,試試手(標題)

Hello Blog&#xff01;&#xff01;轉載于:https://blog.51cto.com/10999994/1786094

【CASS精品教程】CASS9.1生成標準圖幅案例教程

在CASS中,可以很方便的生成標準圖幅,如50*50。本文演示cass中,根據測區范圍標準圖幅生成過程。 一、圖幅預覽: 二、圖幅生成 打開測區范圍,如下圖所示: 點擊【繪圖處理】→【批量分幅】→【格網建立】,如下圖所示: 選擇比例尺500,直接回車。 選擇圖幅50*50。 根據測區…

[轉]mpvue中的小程序調用系統自帶查看圖片的功能

mpvue中的小程序調用系統自帶查看圖片的功能 這里舉個栗子&#xff1a; <template><div class"keting"><div class"centsimg dja"><swiper:current"curr"display-multiple-items"1"next-margin"0rpx"c…

隱馬爾科夫

前向、后向算法解決的是一個評估問題&#xff0c;即給定一個模型&#xff0c;求某特定觀測序列的概率&#xff0c;用于評估該序列最匹配的模型。Baum-Welch算法解決的是一個模型訓練問題&#xff0c;即參數估計&#xff0c;是一種無監督的訓練方法&#xff0c;主要通過EM迭代實…

去創業公司不能有一夜暴富的僥幸,更不能指望掉餡餅

為了實現財務自由&#xff0c;去創業公司是一個不錯的選項&#xff0c;我自己也去過創業公司&#xff0c;身邊的朋友也有不少去過或正在創業公司里干&#xff0c;我就結合下我經歷過的和我看到的&#xff0c;說下我的感受。 1 該去哪種類型的創業公司 第一&#xff0c;這個公司…

分布式日志收集系統 - ExceptionLess的安裝、配置、使用

前言Exceptionless 是一個開源的實時的日志收集框架&#xff0c;它可以應用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web API&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;ASP.NET MVC 等技術開發的應用程序中&#xff0c;并且提供了REST接…

[轉]使用npm發布vue組件

&#x1f636; NPM 是隨同 NodeJS 一起安裝的 javascript 包管理工具&#xff0c;能解決 NodeJS 代碼部署上的很多問題 發布前的準備 注冊一個 npm 賬號 前往 NPM 官網進行注冊 初始化項目 這里用的是webpack-simple,可以理解為精簡版的vue-cli。 如果沒有全局安裝 vue 的話&am…

[置頂]tcpflow 抓包

轉自&#xff1a; http://www.rwifeng.com/jekyll/update/2015/04/16/how-to-tcpflow/ tcpflow 抓包 Apr 16, 2015 大家都知道 tcpdump 是一個很方便的抓包工具&#xff0c; 但是 tcpdump 是以包為單位進行輸出的&#xff0c;閱讀起來不是很方便。 而 tcpflow 是面向 TCP 流的…

spark-2.1.0 集群安裝

1、spark安裝前提——必須安裝好Hadoop&#xff08;本人有三臺機&#xff0c;已安裝好Hadoop&#xff09; 2、下載spark&#xff0c;解壓至master機本地文件 3、修改/conf/spark-env.sh&#xff08;原名spark-env.sh.template&#xff0c;把它改過來&#xff09; 配置如下&…

如何用grep命令同時顯示“匹配行”上下的n行?

如何用grep命令同時顯示匹配行上下的n行 標準unix/linux下的grep通過以下參數控制上下文grep -C 5 foo file 顯示file文件中匹配foo字串那行以及上下5行grep -B 5 foo file 顯示foo及前5行grep -A 5 foo file 顯示foo及后5行

【CASS精品教程】CASS自動插入DOM影像(附插件下載)

本文講解在CASS中快速自動插入柵格數據(影像、DOM、DEM)等,支持tif、img等格式。 文章目錄 一、效果預覽二、插件安裝三、插件下載一、效果預覽 二、插件安裝 打開CASS9.1軟件,輸入命令appload,回車。 選擇插入影像插件,點擊【加載】。 輸入命令aimg,回車,可以進行影像…

用python來獲取Github IP地址

Title: 快速獲Github網站的IP地址 Author: JackieZheng Date: 2022-01-20 19:37:35 LastEditTime: 2022-01-22 09:14:49 LastEditors: Please set LastEditors Description: FilePath: \\vsTemp\\gitdns.pyimport os import sys import re import shutil import requestshosts_…

DNS原理及其解析過程【精彩剖析】

DNS原理及其解析過程精彩剖析原創作品&#xff0c;允許轉載&#xff0c;轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://369369.blog.51cto.com/319630/812889網絡通訊大部分是基于TCP/IP的&#xff0c;而TCP/IP是基于IP地址的&am…

sybase sp_procxmode簡述

今天整合存儲過程的腳本時&#xff0c;看到如下語句&#xff1a; sp_procxmode P_InitTaskByCond, anymodeGO 于是查詢了一下【sp_procxmode】 的一些簡單介紹&#xff0c;進行記錄一下&#xff1a;整理中 https://www.google.com.hk/search?newwindow1&safestrict&si…

基于Kubernetes v1.24.0的集群搭建(二)

上一篇文章主要是介紹了&#xff0c;每臺虛擬機的環境配置。接下來我們開始有關K8S的相關部署。另外補充一下上一篇文章中的K8S的changelog鏈接&#xff1a;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md1 配置yum源 所有節點都需要執行此…

[轉]Python 獲取Windows管理員權限

最近在寫一個可以自動更換 hosts 的 python 腳本&#xff0c;但是操作 hosts 需要管理員權限 &#xff0c;所以就想著要怎么獲取。 總結了一下&#xff0c;有三種方法可以獲取&#xff0c;下面分別介紹一下。 1. 以管理員運行 cmd 這個方法很簡單&#xff0c;也無需多說&#x…

JavaScript中的一些特殊用法(一)

為什么80%的碼農都做不了架構師&#xff1f;>>> 1. 不使用script自閉合標簽 script中使用自閉合標簽&#xff0c;雖然他在XHTML中合法&#xff0c;但是不符合HTML規范&#xff0c;而且得不到某些瀏覽器的正確解析。我曾經就在引入EXT時使用此方式&#xff0c;導致無…

SPICE簡史

如今每一天都有不知其數的半導體芯片設計公司與設計驗證工程師&#xff0c;在用著電路仿真軟件SPICE。SPICE廣泛應用在仿真模擬電路&#xff08;例如運放Op Amp&#xff0c;能隙基準穩壓電源Bandgap Reference&#xff0c;數模/模數轉換 AD/DA等&#xff09;&#xff0c;混合信…

【GlobalMapper精品教程】003:影像裁剪、批量影像分幅案例詳解

本文以案例的形式&#xff0c;講解Globalmapper中進行影像矩形框裁剪&#xff0c;矢量范圍裁剪&#xff0c;標準圖幅批量分幅的方法&#xff0c;配套實驗數據為數據包中的data003.rar。訂閱專欄后私信作者&#xff0c;獲取中文安裝包及配套實驗數據包&#xff0c;便于同步學習。…