# 上下文管理
**本文档引用的文件**
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs)
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs)
- [ArchitectureServices.cs](file://GFramework.Core/architecture/ArchitectureServices.cs)
- [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs)
- [README.md](file://GFramework.Core/architecture/README.md)
- [ArchitectureContextTests.cs](file://GFramework.Core.Tests/architecture/ArchitectureContextTests.cs)
- [GameContextTests.cs](file://GFramework.Core.Tests/architecture/GameContextTests.cs)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文档深入解析GFramework的上下文管理系统,重点阐述ArchitectureContext类的设计理念与实现细节,详细说明GameContext的绑定机制,解释IArchitectureContext接口的职责分工,以及上下文在组件生命周期中的关键作用。同时提供线程安全考虑、性能优化策略、最佳实践示例和与其他架构组件的集成方式。
## 项目结构
GFramework的上下文管理位于Core架构包中,采用清晰的分层设计:
- 核心接口层:定义上下文访问契约
- 实现层:提供具体上下文实现和管理器
- 扩展层:为上下文感知组件提供便捷访问
- 测试层:验证上下文行为的正确性
```mermaid
graph TB
subgraph "架构包结构"
A[IArchitectureContext 接口]
B[ArchitectureContext 实现]
C[GameContext 管理器]
D[ArchitectureServices 服务]
E[ContextAwareExtensions 扩展]
F[ContextAwareBase 基类]
end
subgraph "测试层"
T1[ArchitectureContextTests]
T2[GameContextTests]
end
A --> B
B --> C
D --> B
E --> B
F --> B
T1 --> B
T2 --> C
```
**图表来源**
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L1-L225)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L1-L111)
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L1-L123)
**章节来源**
- [README.md](file://GFramework.Core/architecture/README.md#L1-L503)
## 核心组件
GFramework上下文管理系统由以下核心组件构成:
### IArchitectureContext接口
定义了架构上下文的标准契约,提供统一的服务访问入口:
- 服务获取:GetService()
- 组件访问:GetSystem()、GetModel()、GetUtility()
- 业务操作:SendCommand()、SendQuery()、SendEvent()
- 环境管理:GetEnvironment()
### ArchitectureContext类
IArchitectureContext的具体实现,作为架构组件的统一上下文容器:
- 依赖注入容器集成:通过IIocContainer获取服务
- 服务缓存机制:避免重复解析和创建服务实例
- 业务操作封装:统一命令、查询、事件的执行入口
- 环境访问:提供对IEnvironment的便捷访问
### GameContext管理器
静态管理器负责维护架构上下文与类型的映射关系:
- 类型到上下文的绑定:Bind(Type, IArchitectureContext)
- 上下文检索:Get()、GetByType()、GetFirstArchitectureContext()
- 线程安全:使用ConcurrentDictionary保证并发安全
- 生命周期管理:Clear()、Unbind()等清理方法
**章节来源**
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L16-L123)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L16-L225)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
## 架构概览
GFramework的上下文管理系统采用分层架构设计,实现了松耦合的服务访问和统一的业务操作入口。
```mermaid
classDiagram
class IArchitectureContext {
<>
+GetService~TService~() TService?
+GetSystem~TSystem~() TSystem?
+GetModel~TModel~() TModel?
+GetUtility~TUtility~() TUtility?
+SendCommand(command) void
+SendCommand~TResult~(command) TResult
+SendQuery~TResult~(query) TResult
+SendEvent~TEvent~() void
+SendEvent~TEvent~(e : TEvent) void
+RegisterEvent~TEvent~(handler) IUnRegister
+UnRegisterEvent~TEvent~(onEvent) void
+GetEnvironment() IEnvironment
}
class ArchitectureContext {
-_container : IIocContainer
-_serviceCache : Dictionary~Type, object~
+GetService~TService~() TService?
+GetSystem~TSystem~() TSystem?
+GetModel~TModel~() TModel?
+GetUtility~TUtility~() TUtility?
+SendCommand(command) void
+SendCommand~TResult~(command) TResult
+SendQuery~TResult~(query) TResult
+SendEvent~TEvent~() void
+SendEvent~TEvent~(e : TEvent) void
+RegisterEvent~TEvent~(handler) IUnRegister
+UnRegisterEvent~TEvent~(onEvent) void
+GetEnvironment() IEnvironment
}
class GameContext {
<>
-ArchitectureDictionary : ConcurrentDictionary~Type, IArchitectureContext~
+Bind(architectureType, context) void
+Get~T~() T
+GetByType(type) IArchitectureContext
+GetFirstArchitectureContext() IArchitectureContext
+TryGet~T~(out context) bool
+Unbind(architectureType) void
+Clear() void
}
class ArchitectureServices {
-_container : IIocContainer
-_eventBus : IEventBus
-_commandBus : ICommandBus
-_queryBus : IQueryBus
-_asyncQueryBus : IAsyncQueryBus
-_context : IArchitectureContext
+Container : IIocContainer
+EventBus : IEventBus
+CommandBus : ICommandBus
+QueryBus : IQueryBus
+AsyncQueryBus : IAsyncQueryBus
+SetContext(context) void
+GetContext() IArchitectureContext
}
IArchitectureContext <|.. ArchitectureContext
ArchitectureContext --> IIocContainer : "依赖"
GameContext --> IArchitectureContext : "管理"
ArchitectureServices --> IArchitectureContext : "持有"
ArchitectureContext --> ArchitectureServices : "服务来源"
```
**图表来源**
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L16-L123)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L16-L225)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
- [ArchitectureServices.cs](file://GFramework.Core/architecture/ArchitectureServices.cs#L17-L106)
## 详细组件分析
### ArchitectureContext类深度解析
#### 设计目的与实现原理
ArchitectureContext作为架构组件的统一上下文容器,其设计体现了以下核心理念:
1. **单一职责原则**:集中管理所有架构相关服务的访问
2. **懒加载优化**:仅在首次请求时解析和缓存服务实例
3. **类型安全**:通过泛型约束确保类型安全性
4. **错误处理**:提供明确的异常信息指导开发者
#### 服务缓存机制
ArchitectureContext实现了智能的服务缓存机制:
```mermaid
flowchart TD
A["GetService() 调用"] --> B{"缓存中存在?"}
B --> |是| C["直接返回缓存实例"]
B --> |否| D["从IoC容器解析服务"]
D --> E{"解析成功?"}
E --> |是| F["缓存服务实例"]
E --> |否| G["返回null"]
F --> H["返回服务实例"]
C --> I["结束"]
G --> I
H --> I
```
**图表来源**
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L31-L41)
#### 业务操作封装
ArchitectureContext统一封装了命令、查询、事件的执行流程:
```mermaid
sequenceDiagram
participant Client as "客户端代码"
participant Context as "ArchitectureContext"
participant Bus as "业务总线"
participant Service as "目标服务"
Client->>Context : SendCommand(command)
Context->>Context : GetOrCache()
Context->>Bus : Send(command)
Bus->>Service : 执行业务逻辑
Service-->>Bus : 返回结果
Bus-->>Context : 完成
Context-->>Client : 结束
```
**图表来源**
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L115-L134)
**章节来源**
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L16-L225)
### GameContext绑定机制详解
#### Bind方法实现逻辑
GameContext的Bind方法实现了架构上下文与类型的绑定关系:
```mermaid
flowchart TD
A["Bind(architectureType, context)"] --> B["TryAdd(architectureType, context)"]
B --> C{"添加成功?"}
C --> |是| D["绑定成功"]
C --> |否| E["抛出InvalidOperationException"]
E --> F["错误消息: '架构上下文已存在'"]
```
**图表来源**
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L27-L32)
#### 类型到上下文的映射关系
GameContext维护了一个ConcurrentDictionary来管理映射关系:
| 方法 | 功能 | 线程安全 |
|------|------|----------|
| Bind | 绑定架构类型到上下文 | 是 |
| Get | 获取指定类型的上下文 | 是 |
| GetByType | 根据类型获取上下文 | 是 |
| GetFirstArchitectureContext | 获取第一个上下文 | 是 |
| TryGet | 尝试获取上下文 | 是 |
| Unbind | 移除绑定 | 是 |
| Clear | 清空所有绑定 | 是 |
**章节来源**
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
### IArchitectureContext接口职责分析
#### 服务访问职责
IArchitectureContext接口定义了统一的服务访问标准:
1. **通用服务获取**:GetService()提供任意服务的访问
2. **特定组件访问**:GetSystem()、GetModel()、GetUtility()提供强类型访问
3. **环境访问**:GetEnvironment()提供运行环境信息
#### 业务操作职责
接口还定义了统一的业务操作入口:
1. **命令处理**:SendCommand()系列方法支持同步和异步命令执行
2. **查询处理**:SendQuery()系列方法支持同步和异步查询执行
3. **事件管理**:SendEvent()、RegisterEvent()、UnRegisterEvent()提供完整的事件生命周期管理
**章节来源**
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L16-L123)
### 上下文在组件生命周期中的作用
#### SetContext方法调用时机
在Architecture基类中,上下文的设置遵循严格的生命周期:
```mermaid
stateDiagram-v2
[*] --> 初始化阶段
初始化阶段 --> 创建上下文 : InitializeInternalAsync()
创建上下文 --> 绑定上下文 : GameContext.Bind()
绑定上下文 --> 设置服务上下文 : Services.SetContext()
设置服务上下文 --> 用户自定义初始化 : Init()
用户自定义初始化 --> 组件初始化 : InitializeAllComponentsAsync()
组件初始化 --> 冻结容器 : Container.Freeze()
冻结容器 --> 就绪状态 : EnterPhase(Ready)
就绪状态 --> [*]
就绪状态 --> 销毁阶段 : Destroy()
销毁阶段 --> [*]
```
**图表来源**
- [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L531-L566)
#### 上下文传递机制
组件通过以下方式接收上下文:
1. **自动传递**:Architecture.RegisterSystem/RegisterModel/RegisterUtility自动调用SetContext
2. **手动获取**:ContextAwareBase通过GameContext.GetFirstArchitectureContext()获取
3. **扩展方法**:ContextAwareExtensions提供便捷的上下文访问方法
**章节来源**
- [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L423-L483)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L231)
## 依赖关系分析
### 组件依赖图
GFramework上下文管理系统各组件之间的依赖关系如下:
```mermaid
graph TB
subgraph "接口层"
IA[IArchitectureContext]
IB[IEventBus]
IC[ICommandBus]
IQ[IQueryBus]
ID[IAsyncQueryBus]
IE[IEnvironment]
end
subgraph "实现层"
AC[ArchitectureContext]
GC[GameContext]
AS[ArchitectureServices]
AR[Architecture]
end
subgraph "扩展层"
CE[ContextAwareExtensions]
CB[ContextAwareBase]
end
IA --> AC
IB --> AC
IC --> AC
IQ --> AC
ID --> AC
IE --> AC
AC --> AS
GC --> AC
AR --> AC
CE --> AC
CB --> AC
```
**图表来源**
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L16-L123)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L16-L225)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
- [ArchitectureServices.cs](file://GFramework.Core/architecture/ArchitectureServices.cs#L17-L106)
- [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L23-L569)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L231)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
### 依赖注入与服务注册
ArchitectureServices负责核心服务的注册和管理:
| 服务类型 | 实现类 | 注册位置 | 用途 |
|----------|--------|----------|------|
| IEventBus | EventBus | 构造函数 | 事件发布订阅 |
| ICommandBus | CommandBus | 构造函数 | 命令执行调度 |
| IQueryBus | QueryBus | 构造函数 | 查询执行调度 |
| IAsyncQueryBus | AsyncQueryBus | 构造函数 | 异步查询执行调度 |
| IIocContainer | IocContainer | 构造函数 | 依赖注入容器 |
**章节来源**
- [ArchitectureServices.cs](file://GFramework.Core/architecture/ArchitectureServices.cs#L17-L106)
## 性能考量
### 线程安全设计
GFramework在上下文管理中采用了多种线程安全策略:
1. **ConcurrentDictionary**:GameContext使用ConcurrentDictionary确保多线程环境下的一致性
2. **服务缓存**:ArchitectureContext的Dictionary在单线程环境下使用,避免锁竞争
3. **不可变配置**:架构常量使用ImmutableDictionary确保并发安全
### 性能优化策略
#### 缓存优化
- **服务实例缓存**:避免重复解析IoC容器中的服务实例
- **懒加载机制**:仅在首次访问时创建和缓存服务
- **弱引用策略**:对于可能被销毁的服务,考虑使用弱引用避免内存泄漏
#### 并发优化
- **无锁数据结构**:优先使用ConcurrentDictionary而非加锁的普通字典
- **批量操作**:支持批量注册和获取组件,减少方法调用开销
- **异步处理**:提供异步版本的业务操作,避免阻塞主线程
#### 内存管理
- **对象池化**:对于频繁创建销毁的对象,考虑使用对象池
- **及时释放**:确保不再使用的上下文引用能够被垃圾回收
- **弱事件订阅**:避免事件订阅导致的循环引用
**章节来源**
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L11-L12)
- [ArchitectureContext.cs](file://GFramework.Core/architecture/ArchitectureContext.cs#L18-L19)
## 故障排除指南
### 常见问题与解决方案
#### 上下文未绑定问题
**症状**:调用GameContext.Get()时抛出"架构上下文未找到"异常
**原因**:架构实例未正确初始化或上下文未绑定
**解决方案**:
1. 确保Architecture.Initialize()或InitializeAsync()已调用
2. 检查GameContext.Bind()是否在架构初始化后调用
3. 验证架构类型参数是否正确
#### 服务未注册问题
**症状**:调用GetService()返回null或抛出"服务未注册"异常
**原因**:目标服务未在IoC容器中注册
**解决方案**:
1. 确保服务在Architecture.Init()中正确注册
2. 检查服务的生命周期和作用域
3. 验证服务接口与实现类的匹配
#### 线程安全问题
**症状**:多线程环境下出现数据不一致或死锁
**原因**:对GameContext的并发访问
**解决方案**:
1. 使用TryGet()进行安全的上下文获取
2. 避免在多线程环境中修改GameContext的状态
3. 对于需要修改的操作,使用适当的同步机制
### 调试技巧
1. **日志追踪**:利用架构的日志系统跟踪上下文的创建和销毁过程
2. **断点调试**:在SetContext调用处设置断点,验证上下文传递的正确性
3. **单元测试**:编写针对上下文管理的单元测试,验证边界条件
**章节来源**
- [GameContextTests.cs](file://GFramework.Core.Tests/architecture/GameContextTests.cs#L156-L198)
- [ArchitectureContextTests.cs](file://GFramework.Core.Tests/architecture/ArchitectureContextTests.cs#L85-L111)
## 结论
GFramework的上下文管理系统通过精心设计的架构,实现了组件间松耦合的通信和统一的服务访问。ArchitectureContext作为核心容器,不仅提供了强大的服务管理能力,还通过智能缓存和统一的业务操作入口,显著提升了系统的可维护性和性能。GameContext的线程安全设计和灵活的绑定机制,确保了在复杂应用场景下的稳定性和可靠性。结合IArchitectureContext接口的标准化契约,整个系统形成了清晰的层次结构和明确的职责分工。
## 附录
### 最佳实践示例
#### 在组件中正确获取和使用上下文
```csharp
// 方式1:通过ContextAwareBase基类
public class MyComponent : ContextAwareBase
{
protected override void OnContextReady()
{
// 在这里可以安全地使用Context
var system = Context.GetSystem();
var model = Context.GetModel();
}
}
// 方式2:通过ContextAwareExtensions扩展方法
public class MyComponent : IContextAware
{
public void DoSomething()
{
// 使用扩展方法获取上下文服务
var system = this.GetSystem();
var result = this.SendQuery(new MyQuery());
}
}
```
#### 上下文系统的集成方式
1. **架构初始化**:在Architecture.Init()中注册所有需要的组件
2. **上下文绑定**:确保GameContext.Bind()在架构初始化完成后调用
3. **组件设置**:通过Architecture.RegisterSystem/RegisterModel自动设置上下文
4. **服务访问**:在组件中通过Context或扩展方法访问服务
#### 性能优化建议
1. **合理使用缓存**:利用ArchitectureContext的缓存机制避免重复解析
2. **异步操作**:优先使用异步版本的业务操作提升响应性
3. **批量处理**:对于大量组件的注册和初始化,考虑批量操作
4. **内存管理**:及时释放不再使用的上下文引用,避免内存泄漏