Files
BuYuHouDuan/docs/08-公共业务服务与领域模型.md
2026-10-12 16:22:04 +08:00

30 KiB
Raw Permalink Blame History

公共业务服务与领域模型(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):

  1. 依据 UserId 查询用户,用户不存在则直接返回;
  2. 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.Core 1.2.9(SignalR 推送)
    • StackExchange.Redis 2.7.4(Redis 访问)
    • DotNetCore.CAP 8.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.csproj
    • Infrastructure/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/ 目录下的实际源代码整理;未在该目录内确认的信息未纳入。)