30 KiB
公共业务服务与领域模型(CommonDomain + CommonService)—— 功能与代码目录文档
本文档为 公共领域模型层(CommonDomain) 与 公共业务服务层(CommonService) 的完整上下文说明,面向其他 AI 对话与开发者,内容以
d:\BUYUHouDuanNet\BuYu下的实际源代码为准,自包含、可直接作为该模块的开发/理解上下文使用。所有路径均为相对解决方案根目录d:\BUYUHouDuanNet\BuYu的相对路径。
一、平台背景与模块位置
本平台是捕鱼 + 棋牌游戏运营平台后端,解决方案文件为 Template0524.sln。整体技术栈:
- 运行时/框架:.NET 8(各工程统一
TargetFramework=net8.0)、ASP.NET Core。 - 数据存储:MongoDB(通过自研
Infrastructure/MongoRepository仓储封装)、PostgreSQL(CAP 消息日志存储)。 - 缓存:Redis(通过
RedisService工程与StackExchange.Redis)。 - 消息队列:RabbitMQ,统一通过 DotNetCore.CAP 进行发布/订阅与可靠投递。
- 实时通信:SignalR(
Microsoft.AspNetCore.SignalR.Core)。 - 网关:Ocelot 网关,监听
http://localhost:8001。 - 日志:NLog。
- 依赖注入:Autofac(各 Host 通过
AutofacModule按*Service命名约定扫描注册)。
各主机(Host)进程端口:
| 主机 | 端口 |
|---|---|
| AdminHost(后台管理) | 5241 |
| UserHost(用户端) | 5245 |
| CustomerHost(客服端) | 5247 |
| ChessGameHost(象棋游戏) | 5242 |
| FishRoomHost(捕鱼房间) | 5244 |
| FishGameHost(捕鱼游戏) | 5248 |
本模块在解决方案中的位置:
CommonDomain/:跨模块共享的领域模型层,只依赖底层仓储封装Infrastructure/MongoRepository,被多个业务域工程引用(见第四节)。CommonService/:跨模块共享的公共业务服务层,依赖CommonDomain、UserService、UserDomain、RedisService、MongoRepository,并提供 CAP 消息订阅者与 SignalR 推送封装。
抽奖消息(如 Lottery.DrawPrize)即由 CommonService 的订阅者 LotteryPrizeSubscriber 消费,并派发到 LotteryPrizeHandler 完成奖励发放。
二、模块简介(定位与职责)
CommonDomain —— 通用领域模型
存放不依赖上层业务、可被所有游戏/运营模块复用的模型、枚举、常量与工具,职责包括:
- Mongo 实体模型:游戏配置(
GameConfig)、活动配置(ActivityConfig)、抽奖配置(LotteryActivityConfig)、任务(GameTask)、FAQ、机器人身份、空房率配置、接口日志(ApiLog)、后台操作日志(BackgroundOperationLog)等。 - 基础模型(
BaseModel/):BaseProduct、BaseProductCount、BaseIdName、BaseIdCount、BaseTitleValue、UserAssetSyncParam以及游戏配置的核心子结构(GameBaseConfig.cs内的鱼/房间/道具/Boss/棋牌/鱼雷等大量配置类)。 - 枚举(
Enum/):游戏类型、鱼类型、商品类型、售卖类型、任务类型等。 - CAP 消息模型(
CapMessageModels.cs):跨服务流转的消息体定义。 - 主题常量(
TopicKeys.cs):CAP 消息主题键集中定义。 - 错误码(
ErrorCodes.cs) 与业务参数类(KillAnnounceParam、AdminKickChessPlayerMessage等)。 - 领域工具/抽取器:
FishSpawnExtractor(把GameConfig抽成出鱼配置 JSON)、LotteryPrizeProductHelper、BattleOrderGiftProductHelper(把商品详情回填到活动配置)。
CommonService —— 公共业务服务
对外提供跨模块可复用的业务能力实现与消息订阅,职责包括:
- 后台运营操作(
BackgroundOperationService):管理员充值/扣除用户金币或钻石、后台操作日志记录与分页查询、用户搜索;并通过 CAP 发布资产变更、VIP 升级、面向用户的通知消息。 - 抽奖业务(
LotteryService+Lottery/LotteryPrizeHandler+Subscribers/LotteryPrizeSubscriber):抽奖配置校验、按权重抽奖、扣费、记录、状态维护、奖品异步发放。 - Mongo 通用仓储服务基类(
MongoBaseService<TDocument>):对IMongoBaseRepository<T>的通用 CRUD/分页/聚合封装。 - SignalR 推送封装(
HubSend<T>):基于 Redis 中的连接标识(CId)向指定用户/分组/全体推送消息。 - 接口日志服务(
ApiLogService):ApiLog的仓储服务。
三、功能清单
3.1 CommonDomain 模型清单
| 文件 | 类型 | 职责 |
|---|---|---|
CommonDomain/GameConfig.cs |
实体 GameConfig + 大量子配置类 |
全局游戏配置聚合根;含鱼类型、房间、房间鱼、鱼阵、用户等级、道具/碎片、刮刮卡、VIP 等级、击杀(KillConfig)、Boss(BossConfig)、象棋(ChessConfig)、捕鱼房间(FishRoomConfig)、Boss 掉落、鱼雷、机器人击杀与 Bot 行为配置 |
CommonDomain/ActivityConfig.cs |
实体 ActivityConfig + 子配置类 |
运营活动聚合根:约战(BattleOrder)、救济金(Relief)、签到、金币/钻石商店、注册奖励、捕鱼返水、抽奖(LotteryActivityConfig)、排行榜奖励;含 AutoStopExpired 过期自动关闭抽奖 |
CommonDomain/LotteryActivityConfig.cs |
抽奖配置模型 | LotteryActivityConfig / LotteryPoolLevel / LotteryPrize:活动开关与时间、奖池(PoolType/权重/奖品列表)、各奖池分档消耗、用户最大抽奖次数;奖品含类型、数量、权重、总量与已抽数量 |
CommonDomain/GameTask.cs |
实体 GameTask |
任务定义:状态、编号、任务类型/事件、目标次数、经验奖励;集合 game_task |
CommonDomain/Faq.cs |
实体 + 树节点 | FAQ 分类 FaqCategory、问题 FaqQuestion、分类树 FaqCategoryTreeNode |
CommonDomain/BotProfileEntity.cs |
实体 | 机器人头像/昵称配置;集合 bot_avatar_config |
CommonDomain/EmptyRoomRateConfig.cs |
实体 | 按游戏类型+房间等级配置的空房率;集合 empty_room_rate_config |
CommonDomain/ApiLog.cs |
实体 | 接口访问日志(IP、token、耗时、请求/响应、UA、时间、来源、设备等);集合按月分表 api_log_{yyyyMM} |
CommonDomain/BackgroundOperationLog.cs |
实体 | 后台操作日志(管理员、目标用户、操作类型、货币类型、金额、备注、时间);集合 background_operation_log(库 data_0524_user) |
CommonDomain/CapMessageModels.cs |
消息模型 | CAP 消息体:后台操作通知、玩家因子变更、配置变更、登录绑定/结果、抽奖结果 LotteryDrawMessage、临时出鱼、召唤卡出鱼 |
CommonDomain/TopicKeys.cs |
常量 | CAP 主题键集中定义(见第七节) |
CommonDomain/ErrorCodes.cs |
常量 | 统一业务错误码(房间、金币、签名、道具等) |
CommonDomain/KillAnnounceParam.cs |
参数 | 全局击杀公告参数 |
CommonDomain/AdminKickChessPlayerMessage.cs |
消息模型 | 后台踢出象棋玩家消息(RoomId/UserId/Reason) |
CommonDomain/FishingKillConfig.cs |
配置模型 | 捕鱼击杀相关精简配置(鱼类型简报、击杀、Boss、掉落、鱼雷、约战开关) |
CommonDomain/FishSpawnExtractor.cs |
静态工具 | 从 GameConfig 抽取并序列化为出鱼配置 JSON(FishSpawnConfigStoreModel) |
CommonDomain/LotteryPrizeProductHelper.cs |
静态工具 | 依据 GameConfig 回填抽奖奖品的名称/图标/商品详情,并推断其类型(道具=3 / 碎片=4) |
CommonDomain/BattleOrderGiftProductHelper.cs |
静态工具 | 依据 GameConfig 回填约战礼包(GiftConfig)商品详情 |
CommonDomain/IPendingSettlementService.cs |
接口 | 待结算服务契约(结算金币、清理房间) |
3.2 CommonDomain 基础模型(CommonDomain/BaseModel/)
| 文件 | 职责 |
|---|---|
BaseModel/BaseProduct.cs |
商品基础模型(编号、名称、描述、图片、类型、等级) |
BaseModel/BaseProductCount.cs |
继承 BaseProduct 并附加数量 Count(奖励/道具通用) |
BaseModel/BaseIdName.cs |
Id + Name 通用结构 |
BaseModel/BaseIdCount.cs |
Id + Count 通用结构 |
BaseModel/BaseTitleValue.cs |
Title + Value 通用结构 |
BaseModel/UserAssetSyncParam.cs |
用户资产同步参数(用户、货币、变更方向、金额、变更后余额、来源、备注) |
BaseModel/GameBaseConfig.cs |
游戏配置核心子结构集合:GlobalRandom 随机工具、FishTypeConfig、RoomConfig、RoomFishConfig、FishArrayConfig、UserLevelConfig、PropInfConfig/PropFragmentConfig/BasePropInfo、VipLevelConfig、GiftConfig、KillConfig、BossConfig(含轮盘/扑克/飞盘/全屏/范围/弹药箱/星际巡航/火焰风暴/炸弹/蝎子/概率/幸运龙等大量子配置与概率工具方法)、ChessConfig、FishRoomConfig、TorpedoItemConfig 等 |
BaseModel/FishSpawnConfig.cs |
出鱼配置存储模型:FishSpawnConfigStoreModel / FishSpawnLevelConfig / FishSpawnProbability / FishSpawnFish / FishSpawnArray |
3.3 CommonDomain 枚举(CommonDomain/Enum/)
| 文件 | 枚举 |
|---|---|
Enum/GameTypeEnum.cs |
游戏类型:None=0、风雷之渊=1、永夜尸城=2、中国象棋=3、星际迷航=4、黑神话悟空=5 |
Enum/FishTypeEnum.cs |
鱼类型:普通鱼=1、Boss鱼=2、黄金鱼=3、特殊鱼=4、特殊Boss=5 |
Enum/ProductTypeEnum.cs |
商品类型:炮台、翅膀、炮塔碎片、翅膀碎片、战神、战神碎片、刮刮卡、改名卡、大喇叭、技能、召唤卡、VipExp、鱼雷;并含 ProductType.MoreProductTypeList |
Enum/SaleTypeEnum.cs |
售卖类型:金币=1、钻石=2 |
Enum/TaskType.cs |
TaskType(每日任务=1、在线时长任务=2)与 TaskEvent(整点在线、在线时长、捕获各类鱼、赢取金币、狂暴、开炮、登录、充值) |
3.4 CommonService 服务能力
| 文件 | 类型 | 能力 |
|---|---|---|
CommonService/BackgroundOperationService.cs |
实现 IBackgroundOperationService |
Charge(充值金币/钻石,钻石按 100:1 换算累计充值并触发 VIP 校验升级)、Deduct(扣除并校验余额)、QueryLogs(后台操作日志分页)、SearchUser(按关键词搜索用户) |
CommonService/IBackgroundOperationService.cs |
接口 | 上述后台操作服务契约 |
CommonService/BackgroundOperation/BackgroundOperationRequest.cs |
DTO | 后台操作请求体(目标用户、货币类型、金额、备注) |
CommonService/LotteryService.cs |
实现 ILotteryService(命名空间为 UserService,见备注) |
GetUserStatus(按活动周期维护用户抽奖状态)、Draw(校验活动/奖池/次数/配置/余额后按权重抽取奖池与奖品、扣费、写记录、更新状态,并发布 Lottery.DrawPrize)、GetUserDrawnPrizes |
CommonService/ILotteryService.cs |
接口(命名空间 CommonService) |
抽奖服务契约(GetUserStatus / Draw(string userId) / GetUserDrawnPrizes) |
CommonService/Lottery/LotteryPrizeHandler.cs |
处理器 | 消费抽奖结果消息:按奖品类型(1=金币、2=钻石、3/4=道具)调用 IUserService.UpdateAssets 增加资产,来源 活动奖励 |
CommonService/Subscribers/LotteryPrizeSubscriber.cs |
CAP 订阅者 | [CapSubscribe("Lottery.DrawPrize")] 订阅抽奖主题并转交 LotteryPrizeHandler |
CommonService/MongoBaseService.cs |
实现 IMongoBaseService<TDocument> |
通用仓储服务基类:查询/过滤/分页/增删改/聚合等对 IMongoBaseRepository<T> 的封装 |
CommonService/IMongoBaseService.cs |
接口 | 通用仓储服务契约 |
CommonService/HubSend.cs |
实现 IHubSend<T> |
SignalR 推送:按用户(经 Redis GetRedisUserCId 查 CId)/分组/全体发送,异常异步告警 |
CommonService/IHubSend.cs |
接口 | 推送契约 |
CommonService/ApiLogService.cs |
实现 IApiLogService |
ApiLog 的仓储服务(继承 MongoBaseService<ApiLog>) |
CommonService/IApiLogService.cs |
接口 | 接口日志服务契约 |
3.5 抽奖订阅/发放流程(重点)
发布方(CommonService/LotteryService.cs → Draw 成功抽中奖品后):
_capPublisher.Publish("Lottery.DrawPrize", new LotteryDrawMessage {
UserId, PrizeId, PrizeName, Type, Count, OtherId
});
消费方(CommonService/Subscribers/LotteryPrizeSubscriber.cs):
[CapSubscribe("Lottery.DrawPrize")]
public async Task HandleLotteryDrawPrize(LotteryDrawMessage message)
=> await _handler.Handle(message);
处理逻辑(CommonService/Lottery/LotteryPrizeHandler.cs → Handle):
- 依据
UserId查询用户,用户不存在则直接返回; switch (message.Type):case 1(金币)/case 2(钻石):调用_userService.UpdateAssets,ChangeType=增加,金币取Count或钻石取Count,来源RewardSource.活动奖励,备注“抽奖获得金币/钻石 x{Count}”;case 3(道具)/case 4(碎片):当OtherId非空时,构造BaseProductCount{ Number=OtherId, Count }作为RewardItems,同样以“增加/活动奖励”入账,备注“抽奖获得道具 x{Count}”。
即:抽奖扣费与中奖判定在 LotteryService 内同步完成并落库,实际资产入账通过 CAP 异步消息 Lottery.DrawPrize 由 LotteryPrizeHandler 完成,实现抽奖与发奖解耦。
备注(代码现状,供准确理解):
CommonService/LotteryService.cs的命名空间声明为UserService,实现的接口是UserService.ILotteryService;而UserSrc/UserService/User/下另有一份LotteryService.cs/ILotteryService.cs(其命名空间声明为CommonService)。UserApi/Lottery/LotteryController.cs通过ILotteryService(命名空间UserService)调用抽奖。本文档只描述CommonService/目录下的文件,但上述跨命名空间重名现象会影响对抽奖链路归属的判断,特此说明。
四、项目结构与技术要点
4.1 CommonDomain/CommonDomain.csproj
- 目标框架:
net8.0;启用ImplicitUsings、Nullable。 - NuGet 包:无显式
PackageReference(依赖来自被引用的仓储工程与传递依赖)。 - 项目引用(唯一):
..\Infrastructure\MongoRepository\MongoRepository.csproj。 - 定位:纯模型/枚举/常量/工具层,不引用任何业务服务工程。
4.2 CommonService/CommonService.csproj
- 目标框架:
net8.0;启用ImplicitUsings、Nullable。 - NuGet 包:
Microsoft.AspNetCore.SignalR.Core1.2.9(SignalR 推送)StackExchange.Redis2.7.4(Redis 访问)DotNetCore.CAP8.3.4(消息发布/订阅)
- 项目引用:
..\Infrastructure\MongoRepository\MongoRepository.csproj..\RedisService\RedisService.csproj..\UserSrc\UserService\UserService.csproj..\CommonDomain\CommonDomain.csproj..\UserSrc\UserDomain\UserDomain.csproj
4.3 依赖关系(谁引用本模块)
- 引用
CommonService的项目:UserSrc/UserApi/UserApi.csproj(用户端 API)CustomerSrc/CustomerApi/CustomerApi.csproj(客服端 API)FishRoomService/FishRoomService.csproj(捕鱼房间服务)FishGameSrc/FishGameService/FishGameService.csproj(捕鱼游戏服务)ChessGameHost/ChessGameHost.csprojInfrastructure/SharpAbp.Infrastructure.Api/SharpAbp.Infrastructure.Api.csproj(公共基础设施)
- 引用
CommonDomain的项目(部分):CommonService、UserSrc/UserDomain、UserSrc/UserService、RedisService、FishGameSrc/FishGameService、AdminSrc/AdminService、CustomerSrc/CustomerService、CustomerSrc/CustomerApi、CustomerSrc/CustomerService.Domain。
4.4 DI 注册要点(Autofac 约定)
Infrastructure/SharpAbp.Infrastructure.Api/Autofac/ApplicationModule.cs:通用扫描注册,对传入程序集按后缀Service/Repository注册,并注册泛型MongoBaseRepository<>(IMongoBaseRepository<>)与MongoBaseService<>(IMongoBaseService<>)、RedisService。UserHost通过AutofacModule : ApplicationModule传入typeof(ApiLogService).Assembly(即 CommonService 程序集),从而注册 CommonService 下所有*Service。AdminHost/Middleware/AutofacModule.cs:RegisterAssemblyTypes(typeof(ApiLogService).Assembly).Where(t => t.Name.EndsWith("Service"))扫描 CommonService 程序集;并显式注册CommonService.BackgroundOperationService → IBackgroundOperationService。FishGameHost/Middleware/AutofacModule.cs、ChessGameHost/Middleware/AutofacModule.cs:同样按*Service扫描 CommonService 程序集。UserHost/Extension/CapExtension.cs:显式注册CommonService.Lottery.LotteryPrizeHandler与CommonService.Lottery.LotteryPrizeSubscriber(CAP 订阅者)。
五、代码目录说明(完整目录树)
CommonDomain/ 通用领域模型层(net8.0,仅引用 MongoRepository)
├── CommonDomain.csproj 工程文件:net8.0 + ImplicitUsings + Nullable,引用 MongoRepository
├── TopicKeys.cs CAP 消息主题键常量集中定义
├── CapMessageModels.cs 跨服务 CAP 消息体(后台操作、因子/配置变更、登录绑定、抽奖结果、出鱼等)
├── ErrorCodes.cs 统一业务错误码常量
├── ActivityConfig.cs 活动配置聚合根 ActivityConfig 及约战/救济/签到/商店/注册/返水/排行榜子配置
├── LotteryActivityConfig.cs 抽奖配置:LotteryActivityConfig / LotteryPoolLevel / LotteryPrize
├── LotteryPrizeProductHelper.cs 抽奖奖品商品详情回填工具(依赖 GameConfig)
├── BattleOrderGiftProductHelper.cs 约战礼包商品详情回填工具(依赖 GameConfig)
├── GameConfig.cs 全局游戏配置聚合根 GameConfig 及 Bot/机器人击杀等子配置
├── GameTask.cs 任务实体 GameTask(集合 game_task)
├── FishingKillConfig.cs 捕鱼击杀精简配置与鱼类型简报
├── FishSpawnExtractor.cs 出鱼配置抽取/序列化工具
├── Faq.cs FAQ 分类/问题实体与分类树节点
├── BotProfileEntity.cs 机器人头像昵称实体(集合 bot_avatar_config)
├── EmptyRoomRateConfig.cs 空房率配置实体(集合 empty_room_rate_config)
├── ApiLog.cs 接口访问日志实体(按月分表 api_log_{yyyyMM})
├── BackgroundOperationLog.cs 后台操作日志实体(集合 background_operation_log)
├── KillAnnounceParam.cs 全局击杀公告参数
├── AdminKickChessPlayerMessage.cs 后台踢出象棋玩家消息
├── IPendingSettlementService.cs 待结算服务接口(结算金币/清理房间)
├── BaseModel/ 通用基础模型与游戏配置子结构
│ ├── BaseProduct.cs 商品基础模型(编号/名称/描述/图片/类型/等级)
│ ├── BaseProductCount.cs 商品 + 数量(奖励通用)
│ ├── BaseIdName.cs Id + Name 通用结构
│ ├── BaseIdCount.cs Id + Count 通用结构
│ ├── BaseTitleValue.cs Title + Value 通用结构
│ ├── UserAssetSyncParam.cs 用户资产同步参数
│ ├── GameBaseConfig.cs 游戏配置核心子结构(鱼/房间/道具/Boss/棋牌/鱼雷 + GlobalRandom 等)
│ └── FishSpawnConfig.cs 出鱼配置存储模型(Level/Probability/Fish/Array)
└── Enum/ 领域枚举
├── GameTypeEnum.cs 游戏类型枚举
├── FishTypeEnum.cs 鱼类型枚举
├── ProductTypeEnum.cs 商品类型枚举 + MoreProductTypeList
├── SaleTypeEnum.cs 售卖类型枚举(金币/钻石)
└── TaskType.cs 任务类型 TaskType 与任务事件 TaskEvent
CommonService/ 公共业务服务层(net8.0,CAP/SignalR/Redis)
├── CommonService.csproj 工程文件:引用 MongoRepository/RedisService/UserService/CommonDomain/UserDomain
├── BackgroundOperationService.cs 后台运营操作服务(充值/扣除/日志查询/用户搜索 + CAP 发布)
├── IBackgroundOperationService.cs 后台运营操作服务接口
├── LotteryService.cs 抽奖服务实现(校验/抽奖/扣费/记录/状态 + 发布 Lottery.DrawPrize)
├── ILotteryService.cs 抽奖服务接口(命名空间 CommonService)
├── MongoBaseService.cs 通用 Mongo 仓储服务基类 MongoBaseService<TDocument>
├── IMongoBaseService.cs 通用 Mongo 仓储服务接口
├── HubSend.cs SignalR 推送封装 HubSend<T>(按用户/分组/全体,经 Redis 取 CId)
├── IHubSend.cs SignalR 推送接口
├── ApiLogService.cs 接口日志服务(继承 MongoBaseService<ApiLog>)
├── IApiLogService.cs 接口日志服务接口
├── BackgroundOperation/ 后台操作相关模型
│ └── BackgroundOperationRequest.cs 后台操作请求体 DTO
├── Lottery/ 抽奖相关处理
│ └── LotteryPrizeHandler.cs 抽奖奖品发放处理器(按类型增加金币/钻石/道具)
└── Subscribers/ CAP 消息订阅者
└── LotteryPrizeSubscriber.cs 订阅 Lottery.DrawPrize 主题并转交处理器
六、关键文件索引
| 文件相对路径 | 职责 |
|---|---|
CommonDomain/CommonDomain.csproj |
领域模型工程(net8.0),仅引用 MongoRepository |
CommonDomain/TopicKeys.cs |
CAP 主题键常量,跨模块消息主题命名规范 |
CommonDomain/CapMessageModels.cs |
CAP 消息体模型集合(含 LotteryDrawMessage、BackgroundOperationNotifyMessage) |
CommonDomain/ActivityConfig.cs |
运营活动聚合根,内嵌抽奖配置 LotteryActivityConfig |
CommonDomain/LotteryActivityConfig.cs |
抽奖奖池/奖品配置模型 |
CommonDomain/GameConfig.cs |
全局游戏配置聚合根(鱼/房间/道具/Boss/机器人等) |
CommonDomain/BaseModel/GameBaseConfig.cs |
游戏配置核心子结构与参数类、随机与概率工具 |
CommonDomain/BaseModel/FishSpawnConfig.cs |
出鱼配置存储模型 |
CommonDomain/BaseModel/BaseProduct.cs |
通用商品基础模型 |
CommonDomain/BaseModel/UserAssetSyncParam.cs |
用户资产同步参数 |
CommonDomain/FishSpawnExtractor.cs |
出鱼配置抽取/序列化工具 |
CommonDomain/LotteryPrizeProductHelper.cs |
抽奖奖品详情回填工具 |
CommonDomain/BattleOrderGiftProductHelper.cs |
约战礼包详情回填工具 |
CommonDomain/ErrorCodes.cs |
统一业务错误码 |
CommonDomain/Enum/*.cs |
领域枚举(游戏/鱼/商品/售卖/任务类型) |
CommonService/CommonService.csproj |
公共服务工程(CAP/SignalR/Redis 依赖与项目引用) |
CommonService/BackgroundOperationService.cs |
后台充值/扣除/日志/用户搜索,CAP 发布资产变更与通知 |
CommonService/LotteryService.cs |
抽奖实现,发布 Lottery.DrawPrize |
CommonService/Lottery/LotteryPrizeHandler.cs |
抽奖结果派发,按类型增加用户资产 |
CommonService/Subscribers/LotteryPrizeSubscriber.cs |
订阅 Lottery.DrawPrize 的 CAP 订阅者 |
CommonService/MongoBaseService.cs |
通用 Mongo 仓储服务基类 |
CommonService/HubSend.cs |
SignalR 推送封装(Redis 取 CId) |
CommonService/ApiLogService.cs |
接口日志仓储服务 |
七、与其他模块的交互
7.1 CAP / RabbitMQ 消息主题
主题键常量(CommonDomain/TopicKeys.cs):
| 常量 | 值 |
|---|---|
| 任务完成 | Topic_0524_CompletedTask |
| 用户资产变更 | Topic_0524_UserAssetsChanged |
| 游戏金币结算 | Topic_0524_GameCoinsSettlement |
| 用户升级 | Topic_0524_UserLevel |
| 击杀鱼日志 | Topic_0524_KillFishLog |
| 房间变化 | Topic_0524_RoomChage |
| 全局击杀公告 | Topic_0524_GlobalKillAnnounce |
| 玩家踢出 | Topic_0524_PlayerKicked |
| 用户资产同步前端 | Topic_0524_UserAssetSyncFrontend |
| 因子变更 | Topic_0524_PlayerFactorChanged |
| 配置变更 | Topic_0524_ConfigChanged |
| 登录绑定 | Topic_0524_LoginBind |
| 拒绝回房 | Topic_0524_DismissPendingRoom |
| 登录结果通知 | Topic_0524_LoginBindResult |
| 临时强制出鱼 | Topic_0524_TempSpawnFish |
| 召唤卡出鱼 | Topic_0524_SummonCardFish |
| 后台踢出象棋玩家 | Topic_0524_AdminKickChessPlayer |
CommonService 直接参与的主题(基于本目录代码):
- 订阅:
Lottery.DrawPrize——CommonService/Subscribers/LotteryPrizeSubscriber.cs([CapSubscribe("Lottery.DrawPrize")]),由LotteryPrizeHandler发放奖品。
- 发布:
Lottery.DrawPrize——CommonService/LotteryService.cs(抽奖成功后发布)。VipLevelUp——CommonService/BackgroundOperationService.cs(后台充值钻石触发 VIP 升级)。UserAssetChange——CommonService/BackgroundOperationService.cs(后台充值/扣除后的资产变更)。BackgroundOperation.NotifyUser——CommonService/BackgroundOperationService.cs(面向用户的资产变更通知;使用BackgroundOperationNotifyMessage)。
同主题的其他消费方(用于理解消息闭环,不在本模块目录内):
BackgroundOperation.NotifyUser:UserSrc/UserService/Hubs/AdminNotifySubscriber.cs、FishGameSrc/FishGameService/Subscribers/BackgroundAssetSubscriber.cs。TopicKeys相关主题:UserSrc/UserService/User/UserMQService.cs(任务完成、用户资产变更、游戏金币结算、击杀鱼日志)、FishRoomService/MQ/RoomMQService.cs(房间变化、用户资产同步前端)、FishGameSrc/FishGameService/Subscribers/*(因子变更、配置变更、登录绑定、拒绝回房、临时出鱼、召唤卡出鱼)、ChessGameSrc/ChessGameService/Subscribers/*(登录绑定、后台踢出象棋玩家)。
7.2 被 Admin / User / Customer 等模块引用情况
- Admin(后台):
AdminSrc/AdminService引用CommonDomain;AdminApi/BackgroundOperation/BackgroundOperationController.cs注入CommonService.IBackgroundOperationService,暴露POST adminapi/BackgroundOperation/charge、deduct、GET logs、GET search-user。AdminHost通过 Autofac 显式注册BackgroundOperationService。 - User(用户端):
UserSrc/UserApi引用CommonService;UserApi/Lottery/LotteryController.cs注入ILotteryService(命名空间UserService)与IActivityConfigService、IGameConfigService,使用CommonDomain的LotteryPrizeProductHelper.Enrich回填奖品详情,暴露api/Lottery/Config、Draw、UserStatus、DrawnPrizes。UserHost通过ApplicationModule扫描 CommonService 程序集并注册LotteryPrizeSubscriber/LotteryPrizeHandler。 - Customer(客服端):
CustomerSrc/CustomerApi、CustomerSrc/CustomerService、CustomerSrc/CustomerService.Domain引用CommonDomain。 - 捕鱼(FishRoom / FishGame):
FishRoomService、FishGameService引用CommonService;对应 Host 通过 Autofac 扫描 CommonService 程序集。 - Chess(象棋):
ChessGameHost引用CommonService(使用CommonService类型注册扫描),并消费TopicKeys.后台踢出象棋玩家、TopicKeys.登录绑定等主题。 - 公共基础设施:
Infrastructure/SharpAbp.Infrastructure.Api引用CommonService,其ApplicationModule负责通用注册(含MongoBaseService<>、MongoBaseRepository<>、RedisService)。
7.3 MongoDB 集合(本模块模型涉及)
| 模型 | 集合名 | 库 |
|---|---|---|
GameConfig |
game_config |
data_0524 |
GameTask |
game_task |
data_0524 |
ActivityConfig |
activity_config |
data_0524 |
FaqCategory |
faq_category |
data_0524 |
FaqQuestion |
faq_question |
data_0524 |
BotProfileEntity |
bot_avatar_config |
data_0524 |
EmptyRoomRateConfig |
empty_room_rate_config |
data_0524 |
ApiLog |
api_log_{yyyyMM}(按月分表) |
data_0524 |
BackgroundOperationLog |
background_operation_log |
data_0524_user(ServiceDatabases.User) |
说明:抽奖相关配置以
ActivityConfig.LotteryActivityConfig内嵌文档形式存储于activity_config,不单独成表;抽奖记录LotteryRecord、用户抽奖状态LotteryUserStatus定义在UserDomain(不在本模块目录内),由LotteryService通过IMongoBaseRepository<>读写。MongoBaseEntity(Infrastructure/MongoRepository/MongoBaseEntity.cs)为所有实体基类,含_id、isdelete、CreateInfo;集合与库名通过[BsonCollection(集合名, 库名)]特性声明。
7.4 Redis 与 SignalR
- Redis:
CommonService/HubSend.cs通过IRedisService.GetRedisUserCId(userId)从 Redis 读取用户与 SignalR 连接标识(CId)的映射,再经IHubContext<T>定向推送;BackgroundOperationService通过IRedisService.GetGameConfig()获取游戏配置用于 VIP 等级校验。 - SignalR:
HubSend<T>提供按单个用户(CId)、多用户、分组、分组排除、全体(SendAll)等推送方法,并对发送异常做异步日志告警。
(全文完。本文档内容均基于 CommonDomain/ 与 CommonService/ 目录下的实际源代码整理;未在该目录内确认的信息未纳入。)