# 上下文感知生成器 **本文档引用的文件** - [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) ## 目录 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
生成器"] BASE["MetadataAttributeClassGeneratorBase
元数据属性类生成器基类"] ATTR["ContextAwareAttribute
特性"] DIAG["ContextAwareDiagnostic
诊断规则"] PATH["PathContests
路径常量"] end subgraph "核心抽象层" ICA["IContextAware
上下文感知接口"] IAC["IArchitectureContext
架构上下文接口"] end subgraph "核心实现层" CABS["ContextAwareBase
基类实现"] GC["GameContext
架构上下文管理"] EXT["ContextAwareExtensions
扩展方法"] STATE["ContextAwareStateBase
状态基类"] 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 { <> } 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)