25. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--预算金额的币种转换

ops/2025/1/18 19:41:25/

这篇文章的代码和22. 【.NET 8 实战–孢子记账–从单体到微服务】–记账模块–切换主币种这篇文章的代码大体一样。这篇文章我们简单讲解一下。
既然收支记录都已经支持主币种转换的同时重新计算收支金额了,那预算也要支持切换主币种重新计算预算金额。我们一起来看一下。

一、实现

实现逻辑在这里我就不说了,不清楚的可以参考专栏的第22篇文章。
首先我们需要修改ConfigController控制器中的Update Action,在其中添加发布重新计算预算金额的消息,代码如下:

/// <summary>
/// 更新用户配置
/// </summary>
/// <param name="configViewModel"></param>
/// <returns></returns>
[HttpPut]
[Route("Update")]
public ActionResult<ResponseData<bool>> Update([FromBody] ConfigViewModel configViewModel)
{try{//more code ....//如果切换的是主币种,那么就将以前的所有金额全部转换成新的主币种的金额if (configViewModel.ConfigTypeEnum == ConfigTypeEnum.Currency){//more code_ = _rabbitMqPublisher.Publish<MainCurrency>("UpdateBudgetAmount","UpdateBudgetAmount", new MainCurrency(){UserId = userId,Currency = configViewModel.Value,OldCurrency = oldValue});}return Ok(new ResponseData<bool>(HttpStatusCode.OK, data: true));}catch (Exception ex){return Ok(new ResponseData<bool>(HttpStatusCode.InternalServerError, "服务器异常"));}
}

在代码中通过UpdateBudgetAmount路由键向RabbitMQ发送重新计算预算金额的消息。接着我们修改RabbitMQBackgroundService类中的StartAsync方法,在其中添加处理预算金额转换的代码,代码如下:

public async System.Threading.Tasks.Task StartAsync(CancellationToken cancellationToken)
{//more code ...//根据新的主币种更新预算金额await _subscriberService.SubscribeAsync<MainCurrency>("UpdateBudgetAmount", "UpdateBudgetAmount",async (mainCurrency) =>{//1.获取所有预算using var scope = _serviceProvider.CreateScope();var budgetServer = scope.ServiceProvider.GetRequiredService<IBudgetServer>();var budgets = budgetServer.Query(mainCurrency.UserId);//2.将所有预算的金额转换为新的主币种(预算中的币种转换为新的主币种)var currencyServer = scope.ServiceProvider.GetRequiredService<ICurrencyServer>();var exchangeRateRecordServer = scope.ServiceProvider.GetRequiredService<IExchangeRateRecordServer>();Currency? query = currencyServer.Query(mainCurrency.Currency);if (query == null){return;}Currency? oldCurrency = currencyServer.Query(mainCurrency.OldCurrency);if (oldCurrency == null){return;}//获取预算币种和主币种的汇率ExchangeRateRecord? exchangeRateRecord =exchangeRateRecordServer.Query($"{oldCurrency.Abbreviation}_{query.Abbreviation}");if(exchangeRateRecord == null){return;}for (int i = 0; i < budgets.Count; i++){var budget = budgets[i];budget.Amount = exchangeRateRecord.ExchangeRate * budget.Amount;budget.Remaining = exchangeRateRecord.ExchangeRate * budget.Remaining;}//3.更新所有预算budgetServer.Update(budgets);});
}

新增的这段代码的功能是通过订阅RabbitMQ的消息来处理主币种变化后的预算金额更新。首先,SubscribeAsync方法用于订阅"UpdateBudgetAmount"消息,并为每条消息定义一个异步处理逻辑。当消息接收到后,代码会使用依赖注入容器_serviceProvider创建一个新的服务范围scope,以确保在处理期间可以获取所需的服务实例。接下来,代码获取IBudgetServer服务来查询与mainCurrency.UserId关联的所有预算。然后,它使用ICurrencyServerIExchangeRateRecordServer来查询新的和旧的币种信息,以及这两种币种之间的汇率。如果查询失败,比如无法找到币种或汇率记录,处理过程将提前终止。接着,代码循环遍历所有预算,并使用获取到的汇率将每个预算的金额和剩余金额从旧币种转换为新币种。这是通过将原金额和剩余金额乘以汇率来实现的。最后,调用budgetServer.Update方法,将更新后的预算列表保存到数据库中。

二、总结

这篇文章的代码与第22篇文章中的代码基本相同,主要目的是在主币种切换时,支持预算金额的重新计算。首先介绍了ConfigController中的Update方法如何在用户配置更新时,通过RabbitMQ发布"UpdateBudgetAmount"消息,触发预算金额的重新计算。然后,文章讲解了在RabbitMQBackgroundService中新增的代码,如何通过SubscribeAsync方法订阅该消息并处理主币种变化后的预算更新。处理逻辑包括获取用户的所有预算、查询新旧币种及其汇率、将预算金额从旧币种转换为新币种,并最终更新预算数据。


http://www.ppmy.cn/ops/151168.html

相关文章

nssctf_WEB部分题解

1.题目:easy_ssrf(ssrf 伪协议读取文件) 1. 题目:![](https://cdn.nlark.com/yuque/0/2024/png/39210681/1734314732935-4ccb798a-8525-4439-90e5-b78551cbfea0.png)看起来没有什么思路,于是随便写个网站看看回显:![](https://cdn.nlark.com/yuque/0/2024/png/39210681/1734314…

Flask学习入门笔记

Flask学习入门笔记 前言1. 安装Flask2. 创建一个简单的Flask应用3. 路由与视图函数3.1 基本路由3.2 动态路由3.3 HTTP方法 4. 请求与响应4.1 获取请求数据4.2 返回响应 5. 模板渲染5.1 基本模板渲染5.2 模板继承 6. 静态文件6.1 静态文件的目录结构6.2 在模板中引用静态文件6.2…

Temp123

MapDB&#xff1a;的持久化机制&#xff0c;以及源码分析和摘取 1、spark streaming--struct streaming 基于 时间间隔 攒批 2、kafka-connect-hdfs 控制 flush.size 和 interval.ms控制 攒批 - 完全自研 攒批机制 - 使用 embeded 版 https://lxblog.com/qianwen/share?shar…

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具&#xff08;如 IDEA&#xff09;和远程服务之间的调试连接。当你启动远程调试时&#xff0c;IDEA 会监听这个配置的端口号&#xf…

tomcat状态一直是Exited (1)

docker run -di -p 80:8080 --nametomcat001 你的仓库地址/tomcat:9执行此命令后tomcat一直是Exited(1)状态 解决办法&#xff1a; 用以下命令创建运行 docker run -it --name tomcat001 -p 80:8080 -d 你的仓库地址/tomcat:9 /bin/bash最终结果 tomcat成功启动

Android Http基础:图片下载并显示和WebView的应用

<RelativeLayout xmlns:android“http://schemas.android.com/apk/res/android” xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"android:paddingLeft"dimen/ac…

【AcWing】蓝桥杯辅导课-递归与递推

目录 1、递归 1.1 递归实现指数型枚举 1.2 递归实现排列型枚举 1.3 递归实现组合型枚举 1.4 带分数 方法一 方法二 2、递推 2.1 简单斐波那契 2.2 费解的开关 2.3 翻硬币 2.4 飞行员兄弟 方法一 方法二 1、递归 递归就是在函数内部自己调用自己 我们以递归的形式…

Linux系统编程:深入理解计算机软硬件体系和架构

一、硬件体系 首先我们要知道&#xff0c;我们最常见的计算机&#xff08;笔记本&#xff09;以及我们不常见的计算机&#xff08;服务器&#xff09;其实本质上都是一堆硬件的结合&#xff1a;cpu、网卡、显卡、内存、磁盘、显示器、键盘…… 但他们并不是毫无章法地放在一起…