# 领域服务
**本文引用的文件**
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs)
- [ISystem.cs](file://GFramework.Core.Abstractions/system/ISystem.cs)
- [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs)
- [IContextUtility.cs](file://GFramework.Core.Abstractions/utility/IContextUtility.cs)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs)
- [README.md(System 使用说明)](file://GFramework.Core/system/README.md)
- [README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md)
- [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs)
- [IArchitecture.cs](file://GFramework.Core.Abstractions/architecture/IArchitecture.cs)
- [README.md(源生成器示例)](file://GFramework.SourceGenerators/README.md)
- [AbstractContextUtilityTests.cs](file://GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本篇文档围绕 GFramework 中“领域服务”的概念展开,结合现有代码库中的 System 与 Utility 层,系统阐述领域服务的定义、职责与设计原则,并明确其与 System、Utility 的边界与协作方式。文档同时给出在 GFramework 中实现领域服务的完整路径:从抽象基类、上下文感知、依赖注入到服务注册与跨服务协作,最后提供战斗计算、物品合成、AI 决策等典型游戏场景的设计与实现思路。
## 项目结构
GFramework 的核心层由以下关键模块组成:
- system:业务逻辑层,负责复杂业务流程与跨聚合协作
- utility:工具层,提供无状态的通用功能
- architecture:架构上下文与组件访问入口
- ioc:依赖注入容器,统一管理对象注册与获取
- rule:上下文感知基类,为需要访问架构上下文的组件提供基础设施
- game/game.abstractions:游戏层与抽象定义(模块化扩展)
```mermaid
graph TB
subgraph "核心层"
SYS["System
业务逻辑层"]
UTL["Utility
工具层"]
ARC["ArchitectureContext
组件访问入口"]
IOC["IocContainer
依赖注入容器"]
RUL["ContextAwareBase
上下文感知基类"]
end
subgraph "游戏层"
MOD["AbstractModule
模块基类"]
end
SYS --> ARC
UTL --> ARC
ARC --> IOC
SYS --> RUL
UTL --> RUL
MOD --> ARC
```
图表来源
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L1-L225)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L1-L43)
- [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33)
章节来源
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L1-L225)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L1-L43)
- [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33)
## 核心组件
- 领域服务(在 GFramework 中体现为 System):负责复杂业务逻辑、跨聚合协作、事件驱动与状态变更,强调“有状态”和“业务编排”。参考 [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)、[ISystem.cs](file://GFramework.Core.Abstractions/system/ISystem.cs#L1-L11)。
- 工具服务(Utility):提供无状态的通用功能,如数学、序列化、随机等,强调“纯函数”和“可复用”。参考 [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L1-L55)、[IContextUtility.cs](file://GFramework.Core.Abstractions/utility/IContextUtility.cs#L1-L10)。
- 上下文感知基类:为需要访问架构上下文的组件提供统一能力,包括上下文设置与获取。参考 [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L1-L43)。
- 依赖注入容器:集中管理对象注册、获取与生命周期,支持单例、多实现注册与冻结保护。参考 [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373)。
- 架构上下文:统一暴露系统、模型、工具的获取入口,以及命令、查询、事件的执行通道。参考 [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L1-L225)。
章节来源
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [ISystem.cs](file://GFramework.Core.Abstractions/system/ISystem.cs#L1-L11)
- [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L1-L55)
- [IContextUtility.cs](file://GFramework.Core.Abstractions/utility/IContextUtility.cs#L1-L10)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L1-L43)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L1-L225)
## 架构总览
GFramework 的领域服务通过“系统(System)+ 工具(Utility)+ 架构上下文(ArchitectureContext)+ 依赖注入(IocContainer)+ 上下文感知(ContextAwareBase)”协同工作,形成清晰的分层与职责边界。
```mermaid
sequenceDiagram
participant C as "调用方"
participant AC as "ArchitectureContext"
participant IOC as "IocContainer"
participant SYS as "System领域服务"
participant UTL as "Utility工具"
C->>AC : 请求获取系统/工具
AC->>IOC : Get()
IOC-->>AC : 返回实例或空
AC-->>C : 返回缓存或新实例
C->>SYS : 调用领域服务方法
SYS->>UTL : 使用工具进行纯函数计算
SYS-->>C : 返回业务结果
```
图表来源
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L26-L105)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L211-L294)
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L13-L62)
- [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L12-L55)
## 详细组件分析
### 领域服务(System)设计与实现
- 无状态或少状态:System 通过事件与模型交互,尽量将状态保留在模型中,System 仅做业务编排与决策。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L484-L491)。
- 复杂业务逻辑封装:System 负责跨聚合的业务流程,如战斗、任务、状态机等。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L162-L432)。
- 事件驱动与跨系统协作:System 通过事件与其他 System 松耦合协作,避免紧耦合。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L282-L365)。
- 生命周期与上下文感知:System 继承自 ContextAwareBase,具备上下文注入能力,可在 OnInit/OnDestroy 中进行初始化与清理。参考 [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L13-L62)、[ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)。
```mermaid
classDiagram
class ContextAwareBase {
-IArchitectureContext Context
+SetContext(context)
+GetContext() IArchitectureContext
#OnContextReady()
}
class ISystem {
<>
+Init()
+Destroy()
+OnArchitecturePhase(phase)
}
class AbstractSystem {
-ILogger _logger
+Init()
+Destroy()
+OnArchitecturePhase(phase)
#OnInit()
#OnDestroy()
}
ContextAwareBase <|-- AbstractSystem
ISystem <|.. AbstractSystem
```
图表来源
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
- [ISystem.cs](file://GFramework.Core.Abstractions/system/ISystem.cs#L1-L11)
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L13-L62)
章节来源
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L1-L43)
- [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L162-L432)
### 工具(Utility)与领域服务的关系
- 无状态与纯函数:Utility 是无状态的工具集合,提供纯函数式能力,避免依赖模型或系统。参考 [README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md#L446-L494)。
- 与 System 的协作:System 通过 ArchitectureContext 获取 Utility,将复杂计算与通用逻辑下沉至 Utility,提升可测试性与复用性。参考 [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L97-L105)。
- 上下文工具(IContextUtility):当工具需要访问架构上下文时,可继承 AbstractContextUtility,获得上下文注入与日志记录能力。参考 [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L12-L55)、[IContextUtility.cs](file://GFramework.Core.Abstractions/utility/IContextUtility.cs#L1-L10)。
```mermaid
classDiagram
class IContextUtility {
<>
+Init()
}
class AbstractContextUtility {
-ILogger Logger
+Init()
+Destroy()
#OnInit()
#OnDestroy()
}
IContextUtility <|.. AbstractContextUtility
```
图表来源
- [IContextUtility.cs](file://GFramework.Core.Abstractions/utility/IContextUtility.cs#L1-L10)
- [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L12-L55)
章节来源
- [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L1-L55)
- [IContextUtility.cs](file://GFramework.Core.Abstractions/utility/IContextUtility.cs#L1-L10)
- [README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md#L446-L494)
### 依赖注入与服务注册
- 注册与获取:IocContainer 支持 Register/Get/GetAll/GetRequired 等方法,提供线程安全与冻结保护。参考 [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L69-L199)、[IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L211-L294)。
- 架构上下文缓存:ArchitectureContext 对服务进行缓存,避免重复解析与降低开销。参考 [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L31-L41)。
- 架构接口:IArchitecture 提供 RegisterSystem/RegisterModel/RegisterUtility 等注册入口。参考 [IArchitecture.cs](file://GFramework.Core.Abstractions/architecture/IArchitecture.cs#L38-L68)。
```mermaid
flowchart TD
Start(["开始"]) --> Reg["注册服务到 IocContainer"]
Reg --> Get["通过 ArchitectureContext.GetService 获取"]
Get --> Cache{"缓存命中?"}
Cache --> |是| Return["返回缓存实例"]
Cache --> |否| Resolve["IocContainer 解析并缓存"]
Resolve --> Return
Return --> End(["结束"])
```
图表来源
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L130-L148)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L26-L41)
章节来源
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L1-L225)
- [IArchitecture.cs](file://GFramework.Core.Abstractions/architecture/IArchitecture.cs#L38-L68)
### 领域服务与系统(System)和工具(Utility)的区别与联系
- 区别
- System:有状态、处理复杂业务流程、跨聚合协作、事件驱动。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L434-L482)。
- Utility:无状态、纯函数、通用工具、可复用性强。参考 [README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md#L446-L494)。
- 联系
- 两者均通过 ArchitectureContext 获取,System 可调用 Utility 完成纯函数计算。
- 两者均可继承 ContextAwareBase,获得上下文注入能力。参考 [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)。
章节来源
- [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L434-L494)
- [README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md#L446-L494)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L1-L43)
### 实现示例与最佳实践
- 使用 AbstractSystem 与 AbstractContextUtility:参考 [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L13-L62)、[AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L12-L55)。
- 服务注册与依赖注入:参考 [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L69-L199)、[IArchitecture.cs](file://GFramework.Core.Abstractions/architecture/IArchitecture.cs#L38-L68)。
- 跨服务协作:参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L282-L365)。
- 上下文感知与生命周期测试:参考 [AbstractContextUtilityTests.cs](file://GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs#L1-L295)。
章节来源
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L1-L55)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373)
- [IArchitecture.cs](file://GFramework.Core.Abstractions/architecture/IArchitecture.cs#L38-L68)
- [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L282-L365)
- [AbstractContextUtilityTests.cs](file://GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs#L1-L295)
### 典型游戏场景设计与实现思路
- 战斗计算服务
- 设计要点:封装伤害计算、减伤、暴击、等级差影响等复杂逻辑;将纯计算下沉至 Utility,System 负责事件驱动与状态更新。
- 参考实现路径:System 通过 ArchitectureContext 获取 Utility 完成计算,再更新模型并发布事件。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L61-L114)、[README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md#L224-L252)。
- 物品合成服务
- 设计要点:根据配方与材料数量判断是否可合成;跨系统协作发放奖励;事件驱动状态变更。
- 参考实现路径:System 监听配方事件,校验条件后触发奖励发放事件。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L282-L365)。
- AI 决策服务
- 设计要点:基于状态机与规则的决策流程;通过事件与模型交互;必要时使用工具进行概率与路径计算。
- 参考实现路径:System 管理状态机,根据事件切换状态并派发命令或事件。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L367-L432)、[README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md#L542-L605)。
章节来源
- [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L61-L114)
- [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L282-L365)
- [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L367-L432)
- [README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md#L224-L252)
- [README.md(Utility 使用说明)](file://GFramework.Core/utility/README.md#L542-L605)
## 依赖分析
- 组件耦合与内聚
- System 与 Utility 通过 ArchitectureContext 解耦,内聚于各自职责边界。
- IocContainer 提供统一注册与获取,避免各层直接依赖具体实现。
- 直接与间接依赖
- System/Utility 间接依赖 IocContainer 与 ArchitectureContext。
- ContextAwareBase 为 System/Utility 提供上下文注入能力。
- 循环依赖
- 通过接口与架构上下文解耦,避免循环依赖风险。
- 外部依赖与集成点
- 事件总线、命令总线、查询总线通过 ArchitectureContext 统一接入。
```mermaid
graph LR
SYS["System"] --> ARC["ArchitectureContext"]
UTL["Utility"] --> ARC
ARC --> IOC["IocContainer"]
SYS --> RUL["ContextAwareBase"]
UTL --> RUL
```
图表来源
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L1-L225)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L1-L43)
章节来源
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L1-L225)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L1-L373)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L1-L43)
## 性能考虑
- 避免频繁获取:在 System/Utility 中缓存常用引用,减少 GetModel/GetSystem/GetUtility 调用频率。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L494-L517)。
- 批量处理:对大量实体的更新采用批量处理,减少事件风暴。参考 [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L519-L534)。
- 服务缓存:ArchitectureContext 对服务进行缓存,降低重复解析成本。参考 [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L31-L41)。
- 线程安全:IocContainer 使用读写锁保证并发安全。参考 [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L21-L23)。
章节来源
- [README.md(System 使用说明)](file://GFramework.Core/system/README.md#L494-L534)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L31-L41)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L21-L23)
## 故障排查指南
- 初始化失败
- 现象:System/Utility 无法初始化或上下文为空。
- 排查:确认已通过 Architecture 注册并调用 Init;检查 ContextAwareBase 的上下文注入链路。参考 [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L19-L29)、[AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L19-L31)、[ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L21-L35)。
- 依赖缺失
- 现象:调用 GetService/GetSystem/GetUtility 返回空。
- 排查:确认已在架构中注册对应服务;检查 IocContainer 的注册与冻结状态。参考 [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L211-L294)、[ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L26-L41)。
- 生命周期问题
- 现象:重复初始化/销毁异常。
- 排查:遵循 AbstractSystem/AbstractContextUtility 的生命周期规范;避免在 Destroy 后继续使用实例。参考 [AbstractContextUtilityTests.cs](file://GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs#L168-L186)。
章节来源
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L19-L41)
- [AbstractContextUtility.cs](file://GFramework.Core/utility/AbstractContextUtility.cs#L19-L42)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L21-L35)
- [IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L211-L294)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L26-L41)
- [AbstractContextUtilityTests.cs](file://GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs#L168-L186)
## 结论
在 GFramework 中,领域服务以 System 为核心载体,通过 ArchitectureContext 与 IocContainer 实现解耦与可扩展,借助 ContextAwareBase 提供上下文感知能力;Utility 则承担无状态的通用计算与工具职责,二者协同完成复杂业务的封装与复用。遵循“System 有状态、Utility 无状态”的设计原则,配合事件驱动与模块化扩展,可构建高内聚、低耦合且易于维护的游戏业务框架。
## 附录
- 模块化扩展:通过 AbstractModule 与 IArchitectureModule 实现模块安装与阶段感知。参考 [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33)、[IArchitecture.cs](file://GFramework.Core.Abstractions/architecture/IArchitecture.cs#L108-L116)。
- 示例参考:控制器与系统协作示例,展示事件监听与系统调用。参考 [README.md(源生成器示例)](file://GFramework.SourceGenerators/README.md#L566-L637)。
章节来源
- [AbstractModule.cs](file://GFramework.Game/architecture/AbstractModule.cs#L1-L33)
- [IArchitecture.cs](file://GFramework.Core.Abstractions/architecture/IArchitecture.cs#L108-L116)
- [README.md(源生成器示例)](file://GFramework.SourceGenerators/README.md#L566-L637)