# 实体与聚合根
**本文引用的文件**
- [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs)
- [IModel.cs](file://GFramework.Core.Abstractions/model/IModel.cs)
- [README.md(Model 包)](file://GFramework.Core/model/README.md)
- [README.md(Property 包)](file://GFramework.Core/property/README.md)
- [README.md(Architecture 包)](file://GFramework.Core/architecture/README.md)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs)
- [TestModel.cs](file://GFramework.Core.Tests/model/TestModel.cs)
- [AsyncTestModel.cs](file://GFramework.Core.Tests/model/AsyncTestModel.cs)
- [FailingModel.cs](file://GFramework.Core.Tests/model/FailingModel.cs)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs)
- [core-api.md](file://docs/api-reference/core-api.md)
- [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md)
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 引言
本篇文档围绕 GFramework 中“实体与聚合根”的概念展开,结合仓库中现有的模型与属性体系,系统阐述实体的定义、特征与实现模式,重点覆盖以下主题:
- 实体与聚合根的边界与职责
- 标识符、生命周期、状态变更等核心概念
- 在 GFramework 中如何实现“可变实体”和“不可变实体”
- AbstractModel 的使用、实体初始化、状态管理等关键实现细节
- 游戏开发中的实际应用案例(玩家实体、角色实体等)
由于仓库中未提供名为 AbstractEntity 的实体基类,本文以“模型即实体”的思路进行说明,并通过 AbstractModel 与 BindableProperty 的组合,展示实体的可变性与状态管理;同时参考 DDD 教程中的“领域实体”示例,帮助读者理解聚合根的边界与不变量。
## 项目结构
GFramework 的实体与状态管理主要分布在以下模块:
- Core 层:模型与属性
- model:模型抽象与接口
- property:可绑定属性,用于状态变更与监听
- rule:上下文感知基类与接口
- extensions:上下文扩展方法
- Game 层:游戏领域的模型示例(设置模型)
- 文档:API 参考与高级模式教程
```mermaid
graph TB
subgraph "Core 模型与属性"
AM["AbstractModel.cs"]
IM["IModel.cs"]
PMD["README.mdModel 包"]
PBD["README.mdProperty 包"]
CAB["ContextAwareBase.cs"]
ICA["IContextAware.cs"]
CAE["ContextAwareExtensions.cs"]
end
subgraph "Game 领域模型"
SM["SettingsModel.cs"]
end
subgraph "文档"
CAD["README.mdArchitecture 包"]
COREAPI["core-api.md"]
ADV["advanced-patterns.md"]
end
AM --> IM
AM --> CAB
AM --> ICA
AM --> CAE
SM --> AM
PMD --> AM
PBD --> AM
CAD --> AM
COREAPI --> AM
ADV --> AM
```
图表来源
- [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L33)
- [IModel.cs](file://GFramework.Core.Abstractions/model/IModel.cs#L10-L10)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L42)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L34)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L9-L103)
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L32-L74)
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L45-L129)
- [README.md(Architecture 包)](file://GFramework.Core/architecture/README.md#L82-L206)
- [core-api.md](file://docs/api-reference/core-api.md#L420-L490)
- [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L213-L369)
章节来源
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L1-L184)
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L1-L342)
- [README.md(Architecture 包)](file://GFramework.Core/architecture/README.md#L1-L503)
## 核心组件
- IModel:模型接口,定义了模型的基本行为与生命周期能力(上下文感知、架构阶段事件、初始化)。
- AbstractModel:模型抽象基类,实现 IModel,提供 OnInit 抽象方法与架构阶段事件处理的空实现。
- BindableProperty:可绑定属性,用于模型状态的监听与响应式更新。
- ContextAwareBase:上下文感知基类,为模型提供架构上下文访问能力。
- ContextAwareExtensions:扩展方法,提供 GetModel/GetSystem 等便捷访问。
章节来源
- [IModel.cs](file://GFramework.Core.Abstractions/model/IModel.cs#L7-L10)
- [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L33)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L42)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L34)
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L32-L74)
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L45-L129)
## 架构总览
GFramework 的架构采用 MVC 与 CQRS 结合的模式,模型层负责数据与状态,系统层负责业务规则,命令与查询负责交互入口。模型通过上下文感知能力访问系统与事件总线,实现松耦合。
```mermaid
graph TB
subgraph "架构层"
ARCH["ArchitectureREADME.md"]
CTX["IArchitectureContextREADME.md"]
BUS["Command/Query/Event BusREADME.md"]
end
subgraph "模型层"
IM["IModelIModel.cs"]
AM["AbstractModelAbstractModel.cs"]
SM["SettingsModelSettingsModel.cs"]
BP["BindablePropertyREADME.md"]
end
subgraph "上下文与扩展"
CAB["ContextAwareBaseContextAwareBase.cs"]
ICA["IContextAwareIContextAware.cs"]
CAE["ContextAwareExtensionsContextAwareExtensions.cs"]
end
ARCH --> CTX
CTX --> BUS
AM --> IM
AM --> CAB
AM --> ICA
AM --> CAE
SM --> AM
AM --> BP
```
图表来源
- [README.md(Architecture 包)](file://GFramework.Core/architecture/README.md#L82-L206)
- [IModel.cs](file://GFramework.Core.Abstractions/model/IModel.cs#L7-L10)
- [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L33)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L42)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L34)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L9-L103)
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L45-L129)
## 详细组件分析
### AbstractModel:模型基类与生命周期
- 职责
- 实现 IModel,提供初始化入口 OnInit
- 提供 OnArchitecturePhase 的空实现,子类可按需覆盖
- 继承 ContextAwareBase,具备上下文感知能力
- 关键点
- OnInit:子类在此实现初始化逻辑,常用于注册属性监听、发送事件等
- OnArchitecturePhase:按架构阶段(如 Ready/Destroying)执行相应处理
- 测试与示例
- TestModel:演示同步初始化与阶段处理
- AsyncTestModel:演示异步初始化与同步初始化的约束
- FailingModel:演示初始化失败的异常处理
```mermaid
classDiagram
class IModel {
+Init()
+OnArchitecturePhase(phase)
}
class AbstractModel {
+Init()
+OnArchitecturePhase(phase)
#OnInit()
}
class ContextAwareBase {
+SetContext(context)
+GetContext()
#OnContextReady()
}
class TestModel {
+Init()
+OnArchitecturePhase(phase)
#OnInit()
}
class AsyncTestModel {
+Init()
+InitializeAsync()
+OnArchitecturePhase(phase)
#OnInit()
}
class FailingModel {
+Init()
+SetContext(context)
+GetContext()
+OnArchitecturePhase(phase)
}
IModel <|.. AbstractModel
ContextAwareBase <|-- AbstractModel
AbstractModel <|-- TestModel
AbstractModel <|-- AsyncTestModel
IModel <|.. FailingModel
```
图表来源
- [IModel.cs](file://GFramework.Core.Abstractions/model/IModel.cs#L7-L10)
- [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L33)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L42)
- [TestModel.cs](file://GFramework.Core.Tests/model/TestModel.cs#L9-L36)
- [AsyncTestModel.cs](file://GFramework.Core.Tests/model/AsyncTestModel.cs#L10-L48)
- [FailingModel.cs](file://GFramework.Core.Tests/model/FailingModel.cs#L11-L51)
章节来源
- [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L33)
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L32-L74)
- [TestModel.cs](file://GFramework.Core.Tests/model/TestModel.cs#L9-L36)
- [AsyncTestModel.cs](file://GFramework.Core.Tests/model/AsyncTestModel.cs#L10-L48)
- [FailingModel.cs](file://GFramework.Core.Tests/model/FailingModel.cs#L11-L51)
### 可绑定属性:状态变更与监听
- BindableProperty 的作用
- 提供可监听的状态值,支持注册回调、立即触发回调、批量设置而不触发事件等
- 在模型中用于表达实体状态(如生命值、等级、金币等),并通过事件通知外部
- 使用模式
- 在模型中定义可绑定属性
- 在 OnInit 中注册监听,根据状态变化发送事件或触发副作用
- 在 UI 控制器中监听属性变化,实现数据绑定
```mermaid
flowchart TD
Start(["进入 OnInit"]) --> DefineProps["定义可绑定属性"]
DefineProps --> Register["注册属性监听"]
Register --> OnChange{"属性值变化?"}
OnChange --> |是| Handle["执行状态变更处理
发送事件/更新其他属性"]
OnChange --> |否| Wait["等待下次变更"]
Handle --> Wait
Wait --> End(["完成初始化"])
```
图表来源
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L101-L129)
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L92-L132)
章节来源
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L45-L129)
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L92-L132)
### 上下文感知与模型获取
- ContextAwareBase 提供 SetContext/GetContext,使模型能够访问架构上下文
- ContextAwareExtensions 提供 GetModel/GetSystem 等扩展方法,简化模型与系统的获取
```mermaid
sequenceDiagram
participant Caller as "调用方"
participant Ext as "ContextAwareExtensions"
participant Ctx as "IArchitectureContext"
participant Container as "IoC 容器"
Caller->>Ext : 调用 GetModel()
Ext->>Ctx : GetContext()
Ctx->>Container : Resolve(typeof(T))
Container-->>Ext : 返回模型实例
Ext-->>Caller : 返回模型
```
图表来源
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L34)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)
- [README.md(Architecture 包)](file://GFramework.Core/architecture/README.md#L32-L34)
章节来源
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L42)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L34)
- [README.md(Architecture 包)](file://GFramework.Core/architecture/README.md#L32-L34)
### 游戏领域模型示例:设置模型
- SettingsModel 展示了如何在模型中管理多种设置节(数据设置与应用器设置),并提供注册、获取与枚举能力
- 该模型同样继承 AbstractModel,体现“模型即实体”的思想
```mermaid
classDiagram
class AbstractModel
class ISettingsModel
class SettingsModel {
-Dictionary _dataSettings
-Dictionary _applicators
+GetData()
+RegisterApplicator()
+GetApplicator()
+TryGet(type, out section)
+All()
#OnInit()
}
ISettingsModel <|.. SettingsModel
AbstractModel <|-- SettingsModel
```
图表来源
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L9-L103)
- [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L33)
章节来源
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L9-L103)
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L32-L74)
### DDD 领域实体与聚合根(概念映射)
- 仓库未提供 AbstractEntity,但教程中展示了“领域实体”的实现思路,可作为聚合根的参考
- 聚合根边界建议
- 仅暴露必要的公开方法,内部通过不变量与领域服务维护一致性
- 通过事件发布领域事件,避免跨聚合直接调用
- 在 GFramework 中的落地
- 使用 AbstractModel 表达聚合根的状态与行为
- 使用 BindableProperty 表达可观察的状态
- 使用命令/查询/事件总线协调跨聚合交互
```mermaid
flowchart TD
Start(["聚合根初始化"]) --> DefineState["定义内部状态可绑定属性"]
DefineState --> ExposeOps["暴露受控操作方法"]
ExposeOps --> Invariant{"满足不变量?"}
Invariant --> |否| Reject["拒绝操作并记录日志"]
Invariant --> |是| Apply["应用状态变更"]
Apply --> Publish["发布领域事件"]
Publish --> End(["完成"])
Reject --> End
```
图表来源
- [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L213-L369)
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L101-L129)
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L92-L132)
章节来源
- [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L213-L369)
## 依赖分析
- 组件耦合
- AbstractModel 依赖 IModel、ContextAwareBase、架构阶段枚举
- ContextAwareExtensions 依赖 IContextAware 与 IArchitectureContext
- SettingsModel 依赖 AbstractModel 与游戏抽象接口
- 外部依赖
- 事件系统、命令/查询总线、IoC 容器由架构层提供
```mermaid
graph LR
IModel["IModel"] --> AbstractModel["AbstractModel"]
ContextAwareBase["ContextAwareBase"] --> AbstractModel
AbstractModel --> SettingsModel["SettingsModel"]
ContextAwareExtensions["ContextAwareExtensions"] --> IContextAware["IContextAware"]
ContextAwareExtensions --> IArchitectureContext["IArchitectureContext"]
```
图表来源
- [IModel.cs](file://GFramework.Core.Abstractions/model/IModel.cs#L7-L10)
- [AbstractModel.cs](file://GFramework.Core/model/AbstractModel.cs#L11-L33)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L42)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L34)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L9-L103)
章节来源
- [README.md(Architecture 包)](file://GFramework.Core/architecture/README.md#L82-L206)
## 性能考虑
- 批量更新:使用 SetValueWithoutEvent 减少事件触发频率,最后统一发送事件
- 比较器优化:为浮点数等属性设置自定义比较器,避免微小波动引发的无效更新
- 监听注销:及时注销监听,防止内存泄漏与重复回调
章节来源
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L278-L302)
- [README.md(Property 包)](file://GFramework.Core/property/README.md#L280-L294)
## 故障排查指南
- 初始化失败
- 检查模型 OnInit 是否抛出异常
- 使用测试模型 FailingModel 的模式定位问题
- 异步初始化冲突
- 确保仅调用 InitializeAsync,避免调用 Init
- 循环依赖
- 避免在属性监听中直接修改其他模型,改用事件或命令协调
章节来源
- [FailingModel.cs](file://GFramework.Core.Tests/model/FailingModel.cs#L11-L51)
- [AsyncTestModel.cs](file://GFramework.Core.Tests/model/AsyncTestModel.cs#L10-L48)
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L170-L177)
## 结论
在 GFramework 中,“模型即实体”的设计使得实体与聚合根的职责清晰:模型承载状态与行为,通过可绑定属性与事件实现状态变更与对外通知;通过上下文感知与架构总线实现松耦合协作。对于需要强 DDD 边界的场景,可参考教程中的领域实体实现,将不变量与领域服务纳入模型边界,配合命令/事件总线实现跨聚合交互。
## 附录
- 实际应用案例
- 玩家实体:使用可绑定属性表达玩家状态(等级、生命值、金币等),在 OnInit 中注册监听并在状态变化时发送事件
- 角色实体:可参考教程中的 Player 类,将攻击、治疗、经验增长等行为封装为聚合根的操作方法
- API 使用示例
- 命令/查询/事件在 API 文档中有完整示例,可参考其中的模型获取与事件发送模式
章节来源
- [README.md(Model 包)](file://GFramework.Core/model/README.md#L92-L168)
- [core-api.md](file://docs/api-reference/core-api.md#L420-L490)
- [advanced-patterns.md](file://docs/tutorials/advanced-patterns.md#L213-L369)