# 上下文感知生成器

<cite>
**本文档引用的文件**
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs)
- [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs)
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs)
- [MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs)
- [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs)
- [ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs)
- [ContextAwareTests.cs](file://GFramework.Core.Tests/rule/ContextAwareTests.cs)
</cite>

## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)

## 简介
本文件面向“上下文感知生成器”的技术文档，系统阐述 ContextAwareGenerator 的工作原理与使用方法，涵盖以下要点：
- ContextAwareAttribute 属性的使用方法与约束
- IContextAware 接口的自动生成与显式接口实现
- 上下文访问方法的实现与懒加载策略
- 诊断系统的工作机制（ContextAwareDiagnostic）
- 生成器如何为标记了 ContextAware 属性的类自动实现 IContextAware
- 生成代码结构与接口实现细节
- 与架构系统的集成方式与最佳实践
- 常见问题与调试技巧

## 项目结构
围绕上下文感知生成器的关键文件分布如下：
- 源代码生成器：GFramework.SourceGenerators/rule/ContextAwareGenerator.cs
- 属性定义：GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs
- 接口定义：GFramework.Core.Abstractions/rule/IContextAware.cs
- 诊断规则：GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs
- 基类实现：GFramework.Core/rule/ContextAwareBase.cs
- 架构上下文：GFramework.Core/architecture/GameContext.cs
- 上下文接口：GFramework.Core.Abstractions/architecture/IArchitectureContext.cs
- 扩展方法：GFramework.Core/extensions/ContextAwareExtensions.cs
- 状态基类：GFramework.Core/state/ContextAwareStateBase.cs
- 生成器基类：GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs
- 路径常量：GFramework.SourceGenerators.Common/constants/PathContests.cs
- 快照测试：GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs
- 单元测试：GFramework.Core.Tests/rule/ContextAwareTests.cs

```mermaid
graph TB
subgraph "源代码生成器层"
GEN["ContextAwareGenerator<br/>生成器"]
BASE["MetadataAttributeClassGeneratorBase<br/>元数据属性类生成器基类"]
ATTR["ContextAwareAttribute<br/>特性"]
DIAG["ContextAwareDiagnostic<br/>诊断规则"]
PATH["PathContests<br/>路径常量"]
end
subgraph "核心抽象层"
ICA["IContextAware<br/>上下文感知接口"]
IAC["IArchitectureContext<br/>架构上下文接口"]
end
subgraph "核心实现层"
CABS["ContextAwareBase<br/>基类实现"]
GC["GameContext<br/>架构上下文管理"]
EXT["ContextAwareExtensions<br/>扩展方法"]
STATE["ContextAwareStateBase<br/>状态基类"]
end
GEN --> BASE
GEN --> ATTR
GEN --> DIAG
GEN --> PATH
GEN --> ICA
GEN --> IAC
CABS --> ICA
EXT --> ICA
EXT --> IAC
GC --> IAC
STATE --> ICA
```

图表来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L112)
- [MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs#L9-L41)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L8-L11)
- [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L8-L21)
- [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L16-L123)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L231)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L13-L74)

章节来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L122)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L8-L11)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)
- [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L8-L21)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L16-L123)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L231)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L13-L74)
- [MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs#L9-L41)
- [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42)

## 核心组件
- ContextAwareGenerator：基于特性元数据扫描并为标记了 ContextAware 的类自动生成 IContextAware 接口实现，包含 Context 属性与显式接口实现。
- ContextAwareAttribute：仅作用于类的特性标记，指示该类需要自动生成上下文感知实现。
- IContextAware：定义 SetContext 与 GetContext 两个核心方法，提供上下文注入与访问能力。
- ContextAwareDiagnostic：提供错误诊断规则，如 ContextAware 仅能用于类等。
- ContextAwareBase：框架提供的基类实现，包含 Context 属性、显式接口实现与 OnContextReady 回调。
- GameContext：静态上下文管理器，提供架构上下文的注册、获取与查询能力。
- IArchitectureContext：架构上下文接口，提供系统、模型、工具、命令、查询、事件等访问能力。
- ContextAwareExtensions：为 IContextAware 提供扩展方法，简化对上下文内服务的访问。
- ContextAwareStateBase：同时实现 IState 与 IContextAware 的状态基类。

章节来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L122)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L8-L11)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)
- [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L8-L21)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L9-L111)
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L16-L123)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L231)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L13-L74)

## 架构总览
上下文感知生成器的整体工作流如下：
- 编译阶段：Roslyn 分析源码，识别标记了 ContextAware 特性的类
- 生成阶段：ContextAwareGenerator 基于 MetadataAttributeClassGeneratorBase 解析特性元数据，校验类的合法性（partial、class），生成实现 IContextAware 的部分类
- 运行阶段：类通过 Context 属性或显式接口方法访问 IArchitectureContext；GameContext 提供上下文注册与获取；扩展方法简化对系统、模型、工具、命令、查询、事件的访问

```mermaid
sequenceDiagram
participant Dev as "开发者"
participant Roslyn as "编译器/源生成器"
participant Gen as "ContextAwareGenerator"
participant Base as "MetadataAttributeClassGeneratorBase"
participant Attr as "ContextAwareAttribute"
participant Intf as "IContextAware"
participant Impl as "生成的部分类"
participant Ctx as "GameContext"
Dev->>Roslyn : 添加 [ContextAware] 到类
Roslyn->>Gen : 触发源代码生成
Gen->>Base : 继承元数据解析
Gen->>Attr : 解析特性元数据
Gen->>Impl : 生成实现 IContextAware 的部分类
Impl->>Intf : 显式接口实现 SetContext/GetContext
Impl->>Ctx : 懒加载获取 IArchitectureContext
Dev-->>Impl : 使用 Context 访问架构服务
```

图表来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L122)
- [MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs#L23-L40)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L8-L11)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L39-L42)

## 详细组件分析

### ContextAwareGenerator 工作原理
- 特性解析：通过 MetadataAttributeClassGeneratorBase 的 ResolveAttribute 基于元数据名称解析 ContextAwareAttribute
- 符号验证：ValidateSymbol 校验类必须为 partial class，否则报告诊断错误
- 代码生成：Generate 输出部分类，显式实现 IContextAware，并生成 Context 属性与方法体
- 方法体生成：针对 SetContext/GetContext 生成具体逻辑，其他方法默认抛出未实现异常

```mermaid
classDiagram
class ContextAwareGenerator {
+AttributeMetadataName : string
+AttributeShortNameWithoutSuffix : string
+ValidateSymbol(...)
+Generate(...)
+GetHintName(symbol) string
-GenerateContextProperty(sb)
-GenerateInterfaceImplementations(sb, interfaceSymbol)
-GenerateMethod(sb, interfaceName, method)
-GenerateMethodBody(sb, method)
}
class MetadataAttributeClassGeneratorBase {
#AttributeMetadataName : string
#ResolveAttribute(compilation, symbol) AttributeData
}
class ContextAwareAttribute {
<<sealed>>
}
class IContextAware {
+SetContext(context)
+GetContext() IArchitectureContext
}
ContextAwareGenerator --|> MetadataAttributeClassGeneratorBase
ContextAwareGenerator --> ContextAwareAttribute : "解析元数据"
ContextAwareGenerator --> IContextAware : "生成显式实现"
```

图表来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L234)
- [MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs#L9-L41)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L8-L11)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)

章节来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L39-L122)
- [MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs#L23-L40)

### Context 属性与上下文解析逻辑
- Context 属性为受保护的懒加载实现，首次访问时通过 GameContext.GetFirstArchitectureContext() 获取第一个可用的架构上下文
- 生成的代码中使用 fully qualified 名称（global:: 前缀）确保跨程序集引用的稳定性
- Context 属性的生成逻辑包含字段缓存与延迟初始化分支

```mermaid
flowchart TD
Start(["访问 Context 属性"]) --> Check["_context 是否为 null?"]
Check --> |是| Load["调用 GameContext.GetFirstArchitectureContext()"]
Load --> Cache["缓存到 _context"]
Cache --> Return["返回 _context"]
Check --> |否| Return
```

图表来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L133-L151)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L39-L42)

章节来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L133-L151)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L39-L42)

### 显式接口实现与方法体生成
- 生成器遍历 IContextAware 的所有普通方法，逐个生成显式接口实现
- SetContext：直接赋值内部字段
- GetContext：返回 Context 属性
- 其他方法：若非 void，抛出未实现异常，避免误用

```mermaid
flowchart TD
Enter(["生成方法体"]) --> Name{"方法名"}
Name --> |SetContext| Set["_context = context"]
Name --> |GetContext| Get["return Context"]
Name --> |其他| Void{"是否 void?"}
Void --> |是| End(["结束"])
Void --> |否| Throw["抛出 NotImplementedException"]
Set --> End
Get --> End
Throw --> End
```

图表来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L186-L233)

章节来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L163-L233)

### 诊断系统工作机制
- ContextAwareDiagnostic 定义 GF_Rule_001 诊断规则，限制 ContextAwareAttribute 仅能应用于类
- ContextAwareGenerator 在 ValidateSymbol 中对类声明进行 partial 与 class 校验，不符合条件时报告诊断

```mermaid
flowchart TD
Scan["扫描类声明"] --> Partial{"是否 partial?"}
Partial --> |否| Report1["报告 ClassMustBePartial 诊断"]
Partial --> |是| Class{"是否 class?"}
Class --> |否| Report2["报告 ContextAwareOnlyForClass 诊断"]
Class --> |是| Pass["通过验证"]
```

图表来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L39-L67)
- [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L13-L20)

章节来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L39-L67)
- [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L13-L20)

### 与架构系统的集成与最佳实践
- 上下文注入：通过 IContextAware.SetContext 注入 IArchitectureContext，随后可通过 Context 属性或扩展方法访问系统、模型、工具、命令、查询、事件等
- 懒加载策略：Context 属性在首次访问时才解析架构上下文，避免不必要的初始化开销
- 扩展方法：ContextAwareExtensions 提供 GetSystem/GetModel/GetUtility/SendCommand/SendQuery/SendEvent/RegisterEvent 等便捷方法，减少样板代码
- 状态管理：ContextAwareStateBase 同时实现 IState 与 IContextAware，便于状态机场景下的上下文访问

章节来源
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L231)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L13-L74)
- [IArchitectureContext.cs](file://GFramework.Core.Abstractions/architecture/IArchitectureContext.cs#L16-L123)

### 使用示例与生成代码结构
- 在类上添加 [ContextAware] 特性，并确保类为 partial class
- 生成器会自动生成部分类，显式实现 IContextAware，并提供 Context 属性
- 生成的代码位于提示名称为 类名.ContextAware.g.cs 的文件中

参考快照测试以了解生成器输出的预期结构与行为。

章节来源
- [ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs#L20-L83)
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L119-L122)

## 依赖关系分析
- ContextAwareGenerator 依赖：
  - MetadataAttributeClassGeneratorBase：提供基于元数据名称解析特性的能力
  - PathContests：提供核心抽象层命名空间常量，用于拼接接口全名
  - ContextAwareAttribute：作为特性元数据名称来源
  - IContextAware：生成显式接口实现的目标接口
  - GameContext：提供上下文解析入口
- ContextAwareBase 依赖：
  - IContextAware：作为基类实现接口
  - GameContext：在 GetContext 未设置时提供默认上下文解析
- ContextAwareExtensions 依赖：
  - IContextAware：扩展方法的接收者
  - IArchitectureContext：扩展方法内部调用上下文方法

```mermaid
graph LR
GEN["ContextAwareGenerator"] --> BASE["MetadataAttributeClassGeneratorBase"]
GEN --> PATH["PathContests"]
GEN --> ATTR["ContextAwareAttribute"]
GEN --> INTF["IContextAware"]
GEN --> CTX["GameContext"]
CBASE["ContextAwareBase"] --> INTF
CBASE --> CTX
EXT["ContextAwareExtensions"] --> INTF
EXT --> CTX
```

图表来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L122)
- [MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs#L9-L41)
- [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L8-L11)
- [IContextAware.cs](file://GFramework.Core.Abstractions/rule/IContextAware.cs#L8-L21)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L39-L42)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L231)

章节来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L122)
- [MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs#L9-L41)
- [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42)
- [ContextAwareBase.cs](file://GFramework.Core/rule/ContextAwareBase.cs#L10-L43)
- [ContextAwareExtensions.cs](file://GFramework.Core/extensions/ContextAwareExtensions.cs#L15-L231)

## 性能考虑
- 懒加载 Context 属性：首次访问时才解析架构上下文，避免无谓的初始化
- 显式接口实现：生成器按需生成方法体，未覆盖的方法默认抛出异常，防止运行期误用
- 扩展方法：通过 IContextAware.GetContext() 获取上下文后再调用，避免重复解析

## 故障排查指南
- 诊断规则 GF_Rule_001：确认 [ContextAware] 仅用于类，且类声明为 partial
- 运行期异常：若调用未覆盖的方法（非 SetContext/GetContext），将抛出未实现异常；请检查生成的接口实现是否完整
- 上下文未设置：GetContext 在未设置时会尝试获取第一个架构上下文；若无可用上下文，需先通过 GameContext.Bind 注册

章节来源
- [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L13-L20)
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L216-L233)
- [GameContext.cs](file://GFramework.Core/architecture/GameContext.cs#L27-L42)
- [ContextAwareTests.cs](file://GFramework.Core.Tests/rule/ContextAwareTests.cs#L15-L101)

## 结论
上下文感知生成器通过特性驱动的方式，为标记了 ContextAware 的类自动生成 IContextAware 接口实现，结合 Context 属性的懒加载与扩展方法，提供了简洁而强大的架构上下文访问能力。配合诊断系统与测试用例，可有效保障生成代码的质量与一致性。

## 附录
- 快照测试：验证生成器输出与预期一致
- 单元测试：验证基类实现与上下文生命周期行为

章节来源
- [ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs#L20-L83)
- [ContextAwareTests.cs](file://GFramework.Core.Tests/rule/ContextAwareTests.cs#L15-L101)