27.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--幣種服務(一)

從本篇文章開始,我們將用兩篇內容詳細介紹幣種服務的實現。幣種服務本身結構較為簡單,核心功能包括內置幣種的初始化、幣種匯率的同步以及匯率的查詢。在本篇中,我們將重點講解如何實現內置幣種的初始化功能,為后續的服務打下基礎。而在下一篇文章中,我們將繼續深入,講解幣種匯率的同步機制以及如何進行匯率的查詢操作。

一、基礎搭建

在基礎搭建部分,與前面的服務類似,我們需要創建一個新的微服務項目,并添加必要的依賴項,以及添加數據庫上下文類和幣種實體類。以下是我們需要完成的步驟:

我們在SporeAccounting解決方案下創建一個名為SP.CurrencyService的 Web API 項目。接著,我們需要添加以下 NuGet 包:AutoMapperPomelo.EntityFrameworkCore.MySqlMicrosoft.EntityFrameworkCore.Designnacos-sdk-csharpnacos-sdk-csharp.Extensions.Configurationnacos-sdk-csharp.AspNetCore。這六個包分別用于自動映射、MySQL 數據庫訪問、Entity Framework Core 設計時支持、Nacos SDK 以及 Nacos 的 ASP.NET Core 擴展,具體使用方法在這里就不詳細講解了,有不清楚的可以參考我其他的專欄,或者在網上搜索相關內容。

接下來,我們創建一個名為Currency的實體類,表示幣種。這個類包含了幣種名稱和幣種縮寫等屬性。實體類代碼如下:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using SP.Common.Model;namespace SP.CurrencyService.Models.Entity;/// <summary>
/// 幣種
/// </summary>
[Table(name: "Currency")]
public class Currency : BaseModel
{/// <summary>/// 幣種名稱/// </summary>[Column(TypeName = "nvarchar(20)")][Required]public string Name { get; set; }/// <summary>/// 幣種縮寫/// </summary>[Column(TypeName = "nvarchar(10)")][Required]public string Abbreviation { get; set; }
}

然后,我們需要創建一個數據庫上下文類CurrencyServiceDbContext,它繼承自DbContext,并包含一個DbSet<Currency>屬性,用于訪問幣種數據。數據庫上下文代碼如下:

using Microsoft.EntityFrameworkCore;
using SP.Common;
using SP.CurrencyService.Models.Entity;namespace SP.CurrencyService.DB;/// <summary>
/// 幣種服務數據庫上下文
/// </summary>
public class CurrencyServiceDbContext : DbContext
{/// <summary>/// 貨幣/// </summary>public DbSet<Currency> Currencies { get; set; }/// <summary>/// 數據庫連接配置/// </summary>private readonly IConfiguration _dbConfig;/// <summary>/// 構造函數/// </summary>/// <param name="dbConfig"></param>public CurrencyServiceDbContext(IConfiguration dbConfig){_dbConfig = dbConfig;}/// <summary>/// 數據庫連接配置/// </summary>/// <param name="optionsBuilder"></param>protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){var serverVersion = ServerVersion.AutoDetect(_dbConfig.GetConnectionString("MySQLConnection"));optionsBuilder.UseMySql(_dbConfig.GetConnectionString("MySQLConnection"), serverVersion);}
}

下一步,在數據庫上下文CurrencyServiceDbContext類中,重寫OnModelCreating方法,在這個方法中我們將調用SeedData方法初始化內置幣種,這樣當我們在遷移數據庫時就會自動初始化內置幣種。這里我們只初始化常用的幾種幣種,當然你也可以根據實際需求添加更多的幣種。代碼如下:

/// <summary>
/// 模型創建
/// </summary>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{SeedData(modelBuilder);base.OnModelCreating(modelBuilder);
}/// <summary>
/// 種子數據
/// </summary>
/// <param name="modelBuilder"></param>
private void SeedData(ModelBuilder modelBuilder)
{long adminUserId = 7333155174099406848;modelBuilder.Entity<Currency>().HasData(new List<Currency>(){new Currency(){Id = Snow.GetId(),Name = "人民幣",Abbreviation = "CNY",CreateUserId = adminUserId,CreateDateTime = DateTime.Now},new Currency(){Id = Snow.GetId(),Name = "美元",Abbreviation = "USD",CreateUserId = adminUserId,CreateDateTime = DateTime.Now},new Currency(){Id = Snow.GetId(),Name = "歐元",Abbreviation = "EUR",CreateUserId = adminUserId,CreateDateTime = DateTime.Now},new Currency(){Id = Snow.GetId(),Name = "日元",Abbreviation = "JPY",CreateUserId = adminUserId,CreateDateTime = DateTime.Now},new Currency(){Id = Snow.GetId(),Name = "英鎊",Abbreviation = "GBP",CreateUserId = adminUserId,CreateDateTime = DateTime.Now},new Currency(){Id = Snow.GetId(),Name = "澳門幣",Abbreviation = "MOP",CreateUserId = adminUserId,CreateDateTime = DateTime.Now},new Currency(){Id = Snow.GetId(),Name = "港元",Abbreviation = "HKD",CreateUserId = adminUserId,CreateDateTime = DateTime.Now},new Currency(){Id = Snow.GetId(),Name = "韓圓",Abbreviation = "KRW",CreateUserId = adminUserId,CreateDateTime = DateTime.Now},new Currency(){Id = Snow.GetId(),Name = "新臺幣",Abbreviation = "TWD",CreateUserId = adminUserId,CreateDateTime = DateTime.Now}});
}

在上面的代碼中,我們使用了Snow.GetId()方法來生成唯一的 ID,這個方法是我們在前面章節中實現的雪花算法 ID 生成器。我們還設置了創建用戶 ID 和創建時間,這些字段都是從BaseModel類繼承而來的。

接著,我們還需要配置nacos相關的信息,這里我們不詳細講解,只是簡單看一下如何在appsettings.json中添加nacos相關的下配置:

{"nacos": {"ServerAddresses": [ "http://14.103.224.141:8848" ],"Namespace": "fa420303-2c1c-4b51-a581-ca7210963549","ServiceName": "SPCurrencyService","GroupName": "DEFAULT_GROUP","ClusterName": "DEFAULT","Username": "SP_ADMIN","Password": "123*asdasd","Weight": 100,"ConfigUseRpc": true,"NamingUseRpc": true,"RegisterEnabled": true,"InstanceEnabled": true,"Ephemeral": true,"GrpcReconnectInterval": 5000,"ConnectionTimeOut": 10000,"Listeners": [{"Optional": false,"DataId":"SP.CurrencyService","Group":"DEFAULT_GROUP"},{"Optional": false,"DataId":"Common","Group":"DEFAULT_GROUP"}]}
}

在這個配置中,我們指定了 Nacos 服務器的地址、命名空間、服務名稱、分組名稱、集群名稱、用戶名和密碼等信息。我們還配置了監聽器,用于監聽配置變更,這些配置將用于 Nacos 的服務注冊和配置管理。

Tip:請根據你自己的 Nacos 服務器地址和命名空間等信息進行相應的修改。如果沒有 Nacos 服務器,可以參考我之前的文章搭建一個 Nacos 服務器,或者使用其他的配置中心。

接下來,在Program.cs文件中配置 Nacos 的服務注冊和配置管理、數據庫上下文,以及AutoMapper。代碼如下:

// 添加Nacos服務注冊
builder.Services.AddNacosAspNet(builder.Configuration);
// 添加Nacos配置中心
builder.Configuration.AddNacosV2Configuration(builder.Configuration.GetSection("nacos"));
builder.Services.AddNacosV2Naming(builder.Configuration);
// 注冊 DbContext
builder.Services.AddDbContext<CurrencyServiceDbContext>(ServiceLifetime.Scoped);
builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly());

最后,我們開始遷移數據庫,在命令行中執行以下命令:

dotnet ef migrations add InitialCreate --context CurrencyServiceDbContext
dotnet ef database update --context CurrencyServiceDbContext

這將創建一個名為InitialCreate的遷移,并將其應用到數據庫中。執行完畢后,我們就完成了幣種服務的基礎搭建,并且初始化了內置的幣種數據。如下圖:
在這里插入圖片描述

二、業務實現

在完成了基礎搭建之后,就要實現幣種服務的功能之一 查詢幣種 。在Service文件夾中新建接口文件ICurrencyServer,該接口中只有一個方法List<CurrencyResponse> Query() 用于查詢幣種列表。接口代碼如下:

using SP.CurrencyService.Models.Entity;
using SP.CurrencyService.Models.Response;namespace SP.CurrencyService.Service;/// <summary>
/// 貨幣服務
/// </summary>
public interface ICurrencyServer
{/// <summary>/// 查詢所有貨幣/// </summary>/// <returns>返回貨幣列表</returns>List<CurrencyResponse> Query();
}

接著,我們在Impl文件夾中新建實現類CurrencyServerImpl,實現ICurrencyServer接口。代碼如下:

using AutoMapper;
using SP.CurrencyService.DB;
using SP.CurrencyService.Models.Entity;
using SP.CurrencyService.Models.Response;namespace SP.CurrencyService.Service.Impl;/// <summary>
/// 貨幣服務實現
/// </summary>
public class CurrencyServerImpl : ICurrencyServer
{private readonly CurrencyServiceDbContext _dbContext;private readonly IMapper _mapper;public CurrencyServerImpl(CurrencyServiceDbContext dbContext, IMapper mapper){_dbContext = dbContext;_mapper = mapper;}/// <summary>/// 查詢所有貨幣/// </summary>/// <returns>返回貨幣列表</returns>public List<CurrencyResponse> Query(){List<Currency> crCurrencies = _dbContext.Currencies.ToList();List<CurrencyResponse> currencyResponses = _mapper.Map<List<CurrencyResponse>>(crCurrencies);return currencyResponses;}
}

在上面的代碼中,我們使用了AutoMapper來將Currency實體類轉換為CurrencyResponse響應類。這樣可以簡化數據傳輸對象的轉換過程,提高代碼的可讀性和可維護性。

接著,在Controller文件夾下新建CurrencyController控制器類,這個控制器只包含一個Web API接口,用于查詢全部幣種。代碼如下:

using Microsoft.AspNetCore.Mvc;
using SP.CurrencyService.Models.Response;
using SP.CurrencyService.Service;namespace SP.CurrencyService.Controllers;/// <summary>
/// 幣種控制器
/// </summary>
[Route("/api/currency")]
[ApiController]
public class CurrencyController : ControllerBase
{private readonly ICurrencyServer _currencyServer;public CurrencyController(ICurrencyServer currencyServer){_currencyServer = currencyServer;}/// <summary>/// 查詢所有幣種/// </summary>/// <returns>返回幣種列表</returns>[HttpGet("query")]public ActionResult<List<CurrencyResponse>> Query(){List<CurrencyResponse> currencies = _currencyServer.Query();return Ok(currencies);}
}

上面的代碼中,通過依賴注入的方式引入了ICurrencyServer接口,在Query Action 方法中我們調用了它的Query方法查詢全部幣種,最后將查詢到的數據返回給API調用方。

最后還需要在Program.cs文件中將ICurrencyServer接口及其實現類CurrencyServerImpl注冊到依賴注入容器中,代碼如下:

builder.Services.AddScoped<ICurrencyServer, CurrencyServerImpl>();

到此為止,幣種服務的內置幣種初始化的全部工作就已完成,當我們運行項目后,就能在Swagger UI界面看到創建的服務了。

三、總結

本篇文章詳細介紹了幣種服務的基礎搭建過程,包括項目結構的創建、依賴包的添加、實體類和數據庫上下文的實現,以及內置幣種的初始化。通過種子數據的方式,確保了服務啟動時能夠自動生成常用幣種數據。同時,介紹了如何實現幣種查詢的業務邏輯,并通過接口和控制器對外提供查詢能力。最后,完成了服務的依賴注入和數據庫遷移,確保服務能夠正常運行。至此,幣種服務的基礎功能已經搭建完成,為后續實現幣種匯率同步和查詢等功能打下了堅實的基礎。下一篇將繼續深入講解幣種匯率相關的實現。

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

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

相關文章

(2)從零開發 Chrome 插件:實現 API 登錄與本地存儲功能

從零開發 Chrome 插件&#xff1a;實現 API 登錄與本地存儲功能 Chrome 插件作為瀏覽器功能的重要擴展&#xff0c;能極大提升用戶的工作效率。本文將以一個「登錄功能插件」為例&#xff0c;帶你從零構建一個可調用 API 驗證身份、并將用戶信息存儲在本地的 Chrome 插件。 基…

Flink時間窗口詳解

一、引言在大數據流處理的領域中&#xff0c;Flink 的時間窗口是一項極為關鍵的技術&#xff0c;想象一下&#xff0c;你要統計一個電商網站每小時的訂單數量。由于訂單數據是持續不斷產生的&#xff0c;這就形成了一個無界數據流。如果沒有時間窗口的概念&#xff0c;你就需要…

寬帶接入,網線插入電腦的經驗

現在一般家里安裝移動寬帶&#xff0c;都會提供四個千兆接口的光貓路由器&#xff0c;但是要注意了 首先網線的兩端看起來一樣&#xff0c;實際上并不是&#xff0c;如果發現連接不成功&#xff0c;那么就要換一頭重新嘗試&#xff0c; 一般像說什么自動DHCP啊&#xff0c;因為…

crmeb多門店對接拉卡拉支付小程序聚合收銀臺集成全流程詳解

一、商戶注冊與配置??注冊支付平臺賬號??&#xff1a;在拉卡拉開放平臺注冊商戶賬號&#xff08;私信聯系注冊&#xff09;??創建應用??&#xff1a;獲取小程序應用ID(AppID)??配置支付參數??&#xff1a;商戶號(MID)終端號(TID)API密鑰支付回調地址二、配置拉卡拉…

C#將樹圖節點展示到NetronLight圖表中

之前寫過NetronLight開源框架 C#使用開源框架NetronLight繪制流程圖-CSDN博客 我們這里將TreeView樹圖的節點內容展示到NetronLight圖表中&#xff0c;按照樹的層次【深度Level】展示 新建窗體應用程序ShowTreeNodeToDiagram&#xff0c;將默認的Form1重命名為FormShowNode&…

精密模具大深徑比微孔尺寸檢測方案 —— 激光頻率梳 3D 輪廓檢測

引言精密模具中大深徑比微孔&#xff08;深徑比&#xff1e;20:1&#xff0c;孔徑&#xff1c;1mm&#xff09;的尺寸精度直接影響注塑件、電子元件等產品的成型質量。此類微孔具有孔徑小、深度大、表面質量要求高&#xff08;Ra≤0.1μm&#xff09;等特點&#xff0c;傳統檢測…

defer學習指南

一、源頭&#xff1a;早期管理資源&#xff08;如數據庫連接、鎖、文件句柄、網絡連接&#xff09;和狀態清理異常麻煩。 必須在每個可能的返回點&#xff08;return、err、panic&#xff09;手動重復清理代碼&#xff0c;極易遺漏且打斷主要邏輯思路&#xff01;像Java語言雖然…

NLP_知識圖譜_大模型——個人學習記錄

1. 自然語言處理、知識圖譜、對話系統三大技術研究與應用 https://github.com/lihanghang/NLP-Knowledge-Graph 深度學習-自然語言處理(NLP)-知識圖譜&#xff1a;知識圖譜構建流程【本體構建、知識抽取&#xff08;實體抽取、 關系抽取、屬性抽取&#xff09;、知識表示、知…

linux:進程詳解(1)

目錄 ?編輯 1.進程基本概念與基本操作 1.1 概念 1.2 描述進程-PCB 1.2.1PCB的基本概念 1.2.2 task_ struct 1.2.3 查看進程 2.進程狀態 2.1 Linux內核源碼展示 2.2 進程狀態查看 ?編輯 2.3 Z(zombie)-僵?進程 2.4 僵尸進程的危害 2.5 孤兒進程 3.進程優先級 …

碳中和目標下的全球產業鏈重構:深度解析與未來路徑

引言&#xff1a;氣候臨界點與產業鏈的系統性風險2023年&#xff0c;全球平均氣溫較工業化前上升1.2℃&#xff0c;南極冰蓋年消融量達1500億噸&#xff0c;極端天氣事件導致的經濟損失占全球GDP的2.3%。這一系列數據背后&#xff0c;暴露出傳統產業鏈的致命缺陷——其設計邏輯…

FPGA實現SDI轉LVDS視頻發送,基于GTX+OSERDES2原語架構,提供2套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目本博已有的 SDI 編解碼方案FPGA實現LVDS視頻收發方案 3、工程詳細設計方案工程設計原理框圖SDI 輸入設備Gv8601a 均衡器GTX 解串SMPTE SD/HD/3G SDI IP核BT1120轉RGB奇…

新手向:使用Python構建高效的日志處理系統

本文將詳細講解如何使用Python開發一個專業的日志分析工具&#xff0c;能夠自動化處理、分析和可視化各類日志文件&#xff0c;大幅提升運維效率。環境準備開發本工具需要以下環境配置&#xff1a;Python環境&#xff1a;建議Python 3.8或更高版本必要庫&#xff1a;pandas&…

大模型-量化技術

簡介 模型量化是一種重要的模型壓縮技術。其核心目標是在可控精度損失下&#xff0c;將大模型中浮點型權重&#xff08;通常為 float32 等高精度格式&#xff09;近似轉換為低精度離散值表示&#xff08;通常為 int8&#xff09;。 具體而言&#xff0c;該技術通過將模型的權重…

【C語言網絡編程】HTTP 客戶端請求(域名解析過程)

在做 C 語言網絡編程或模擬 HTTP 客戶端時&#xff0c;第一步就離不開“把域名解析為 IP 地址”這一步。很多人可能直接復制粘貼一段 gethostbyname 的代碼&#xff0c;但未必真正理解它的原理。 本篇博客將圍繞一個經典函數&#xff1a; char *host_to_ip(const char *hostna…

Node.js特訓專欄-實戰進階:16. RBAC權限模型設計

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從RBAC權限模型的基礎概念、核心組件講起,詳細闡述其設計原則、數據庫模型設計,還會結合代碼示例展示在…

mac上BRPC的CMakeLists.txt優化:解決Protobuf路徑問題

問題背景與挑戰 在構建高性能RPC框架BRPC時&#xff0c;?Protobuf依賴路徑的配置往往是開發者面臨的主要挑戰之一。原始CMake配置在尋找Protobuf庫時存在以下痛點&#xff1a; ?路徑搜索不精確?&#xff1a;默認find_library無法定位自定義安裝路徑下的Protobuf?版本兼容…

Go 性能分析利器:pprof 工具實戰指南

在 Go 語言開發中&#xff0c;性能問題往往是項目上線后最棘手的挑戰之一。無論是 CPU 占用過高、內存泄漏&#xff0c;還是 goroutine 失控&#xff0c;都可能導致服務響應緩慢甚至崩潰。而pprof作為 Go 官方提供的性能分析工具&#xff0c;就像一把精準的手術刀&#xff0c;能…

fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題解決

針對您使用fio測試SSD直接I/O&#xff08;Direct IO&#xff09;性能僅有100MB/s的問題&#xff0c;結合SSD特性和fio測試原理 fio測試SSD直接I/O&#xff08;Direct IO&#xff09;性能僅有100MB/s的問題 - LinuxGuideLinuxGuide 以下是可能的原因及優化方案&#xff1a; &a…

EVO-0:具有隱空間理解的視覺-語言-動作模型

25年6月來自上海交大、EvoMind Tech 和上海算法創新研究院&#xff08;IAAR-Shanghai&#xff09;的論文“EVO-0: Vision-Language-Action Model with Implicit Spatial Understanding”。 視覺-語言-動作 (VLA) 模型已成為一種有前途的框架&#xff0c;可使通用機器人能夠在現…

文心大模型4.5開源測評:輕量化部署實踐與多維度能力驗證

前言&#xff1a;開源浪潮下的輕量化革命 2025年百度文心大模型4.5系列的開源&#xff0c;標志著國產大模型從“參數競賽”轉向“實用落地”的關鍵轉折。當行業仍在追逐千億參數模型時&#xff0c;文心4.5以0.3B輕量級模型撕開一條新賽道——單卡部署、低成本運維、中文場景高…