如何用 ECC 进行 C 项目的模式、测试与代码审查?
发布时间:2026/9/10 6:02:10 锦皓数字建站

如何用 ECC 进行 C# 项目的模式、测试与代码审查【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC如果你在一个 C#/.NET 项目中使用 Claude CodeECC 仓库提供了三个可以配合工作的组件rules/csharp/下的 C# 规则集模式、编码风格、安全、测试、hooks、skills/csharp-testing/SKILL.md测试技能以及 csharp-reviewer agent。本文的任务是把这三者装好并跑通一条完整路径用 C# 规则约束日常代码结构按 xUnit 测试模式编写和运行测试最后由 reviewer agent 输出按严重级别分级的审查结论。前提条件一个 git 管理的 C# 项目reviewer 会执行git diff -- *.cs非 git 目录无法走完整审查流程本机可用dotnetCLI构建、格式化、测试命令都依赖它规则与 agent 面向 Claude Code 安装README 中说明 Claude Code 是 ECC 的主要目标平台。安装 C# 规则与 reviewer agent在 ECC 仓库根目录下执行。规则安装按 rules/README.md 的手动安装方式整个目录复制不要用/*拍平否则会覆盖common/规则并破坏语言文件对../common/的相对引用# 用户级安装创建 ECC 规则命名空间 mkdir -p ~/.claude/rules/ecc/ cp -r rules/common ~/.claude/rules/ecc/ cp -r rules/csharp ~/.claude/rules/ecc/ # 只安装 C# reviewer agent各组件互相独立可只装需要的部分 cp agents/csharp-reviewer.md ~/.claude/agents/如果只想让某个项目生效把规则放到项目根下的.claude/rules/ecc用法相同mkdir -p .claude/rules/ecc cp -r rules/common .claude/rules/ecc/ cp -r rules/csharp .claude/rules/ecc/也可以改用./install.sh安装脚本README 推荐方式但脚本示例中列出的语言参数未包含csharp因此 C# 规则集按上面的手动方式复制即可。安装后rules/csharp/下各文件 frontmatter 中的paths决定了适用范围coding-style.md和patterns.md作用于**/*.cs、**/*.csxtesting.md和security.md额外覆盖**/*.csprojsecurity.md还覆盖**/appsettings*.jsonhooks.md覆盖解决方案级文件**/*.sln、Directory.Build.props等。C# 规则注入了哪些模式与约束模式与依赖注入patterns.mdpatterns.md 给出四个直接可用的模板API 响应统一封装ApiResponseTrecord包含Success、可空Data、可空Error、MetaRepository 模式IRepositoryT接口五个异步操作FindAllAsync、FindByIdAsync、CreateAsync、UpdateAsync、DeleteAsync全部接收CancellationTokenOptions 模式用强类型 options如PaymentsOptions带SectionName常量替代到处读配置原始字符串依赖注入服务边界依赖接口生命周期要有意注册——无状态共享服务用 singleton、请求数据用 scoped、轻量纯工作单元用 transient。编码风格coding-style.mdcoding-style.md 的核心要求启用 nullable reference types公共和内部 API 显式写访问修饰符不可变值型模型优先record/record struct有身份和生命周期的用class应用代码中避免dynamic优先initsetter 和不可变集合不就地修改输入模型更新状态时用profile with { ... }生成新实例优先async/await不用.Result、.Wait()阻塞公共 async API 传递CancellationToken抛出具体异常并用结构化属性记录日志用dotnet format做格式化和 analyzer 修复。安全security.mdsecurity.md 的硬性检查点源码和appsettings.*.json中不得出现真实凭证本地用 user secrets生产用 secret managerSQL 一律参数化查询文档给出 Dapper 示例const string sql SELECT * FROM Orders WHERE CustomerId customerIdDTO 在应用边界校验授权策略在端点或 handler 边界强制执行API 响应不得暴露堆栈、SQL 文本或文件系统路径。按 csharp-testing 技能编写和运行测试csharp-testing SKILL.md 定义的测试技术栈xUnit 作为测试框架FluentAssertions 做断言NSubstitute 或 Moq 做 mockTestcontainers 提供集成测试的真实基础设施WebApplicationFactory用于 ASP.NET Core 集成测试Bogus 生成测试数据。单元测试结构文档给出的结构是 Arrange-Act-Assert测试类为sealed依赖通过构造函数注入xUnit 每个测试创建新实例天然避免共享可变状态public sealed class OrderServiceTests { private readonly IOrderRepository _repository Substitute.ForIOrderRepository(); private readonly ILoggerOrderService _logger Substitute.ForILoggerOrderService(); private readonly OrderService _sut; public OrderServiceTests() { _sut new OrderService(_repository, _logger); } [Fact] public async Task PlaceOrderAsync_ReturnsSuccess_WhenRequestIsValid() { // Arrange var request new CreateOrderRequest { CustomerId cust-123, Items [new OrderItem(SKU-001, 2, 29.99m)] }; // Act var result await _sut.PlaceOrderAsync(request, CancellationToken.None); // Assert result.IsSuccess.Should().BeTrue(); result.Value.Should().NotBeNull(); result.Value!.CustomerId.Should().Be(cust-123); } }方法命名按行为来Method_ExpectedResult_WhenCondition。参数化测试用[Theory]配[InlineData]数据量较大时用MemberData指向一个TheoryDataT静态属性。验证依赖交互用 NSubstitute 的Received断言await _repository.Received(1).AddAsync( Arg.IsOrder(o o.CustomerId request.CustomerId), Arg.AnyCancellationToken());集成测试ASP.NET Core 用WebApplicationFactoryProgram文档示例用RemoveAllDbContextOptionsAppDbContext()替换为UseInMemoryDatabase(TestDb)然后通过HttpClient走 HTTP 请求验证状态码如 404 / 201 Created Locationheader。需要真实数据库时用 Testcontainers 起postgres:16-alpine实现IAsyncLifetime在InitializeAsync中启动容器并执行MigrateAsync()DisposeAsync中释放。rules/csharp/testing.md 还要求tests/下镜像src/结构单元/集成/端到端分层清晰ASP.NET Core 集成测试要覆盖经过 HTTP 的认证、校验和序列化而不是绕过中间件行覆盖率目标 80% 以上重点覆盖领域逻辑、校验、认证和失败路径。反模式清单来自技能文档的表格测实现细节、共享可变测试状态、异步测试里Thread.Sleep、断言ToString()输出、一个测试堆多个断言、按实现命名测试、忽略CancellationToken。运行测试# 跑全部测试 dotnet test # 带覆盖率 dotnet test --collect:XPlat Code Coverage # 只跑指定测试项目 dotnet test tests/MyApp.UnitTests/ # 按测试名过滤 dotnet test --filter FullyQualifiedName~OrderService # 开发时 watch 模式 dotnet watch test --project tests/MyApp.UnitTests/用 csharp-reviewer agent 做代码审查csharp-reviewer agent 的描述为 Use for all C# code changes. MUST BE USED for C# projects.。它在被调用时按固定流程工作执行git diff -- *.cs查看最近的 C# 文件变更执行dotnet build和dotnet format --verify-no-changes如果可用只聚焦被修改的.cs文件随即开始审查。审查优先级agent 按严重级别组织检查项判断依据全部来自 agent 文档级别类别典型问题CRITICAL安全SQL 注入字符串拼接查询、命令注入、路径穿越、不安全反序列化BinaryFormatter、硬编码密钥、缺失[ValidateAntiForgeryToken]/ Razor 未编码输出CRITICAL错误处理空 catch 块、吞异常返回null、缺失using/await using、阻塞式 async.Result、.Wait()、GetAwaiter().GetResult()HIGH异步模式公共 async API 缺CancellationToken、事件处理器之外的async void、库代码缺失ConfigureAwait(false)、sync-over-async 死锁风险HIGH类型安全用!压制 nullable 警告、无类型检查的强制转换、魔法字符串、应用代码中使用dynamicHIGH代码质量超过 50 行的大方法、超过 4 层的嵌套、God class、静态可变共享状态MEDIUM性能循环内字符串拼接、热路径 LINQ 过度分配、EF Core 循环内懒加载的 N1 查询、只读查询缺AsNoTrackingMEDIUM最佳实践命名规范公共成员 PascalCase、私有字段_camelCase、值型模型应改record、直接new服务而不注入、IEnumerable多次枚举未物化、可sealed的类未标注针对框架还有专项检查ASP.NET Core模型校验、auth 策略、中间件顺序、IOptionsT、EF Core迁移安全、Include急切加载、AsNoTracking、Minimal APIs路由分组、endpoint filters、TypedResults、Blazor组件生命周期、StateHasChanged、JS interop 释放。审查输出与判定标准agent 的输出格式固定为以下结构来自 agent 文档定义的格式非某次实际运行日志[SEVERITY] Issue title File: path/to/File.cs:42 Issue: Description Fix: What to change审查结论按发现问题的最高严重级别判定Approve没有 CRITICAL 或 HIGH 问题Warning只有 MEDIUM 问题可谨慎合并Block发现 CRITICAL 或 HIGH 问题。完整跑一遍并验证按顺序执行并判断每一步的结果# 1. 编译检查reviewer 的第一步诊断命令 dotnet build # 2. 格式化检查有格式漂移会报告差异 dotnet format --verify-no-changes # 3. 运行测试reviewer 用 --no-build 跳过重复构建 dotnet test --no-build # 4. 收集覆盖率 dotnet test --collect:XPlat Code Coverage验证方式是dotnet build通过、dotnet test报告测试通过然后让 csharp-reviewer 审查当前变更看它输出的每条问题是否符合上述格式并按 Approve / Warning / Block 三档判断是否可以合并。测试侧再对照 rules/csharp/testing.md 的 80% 行覆盖率目标检查覆盖率结果。可选配置 C# hooks 自动执行检查rules/csharp/hooks.md 建议在~/.claude/settings.json中配置两类 hookPostToolUse编辑 C# 文件后自动执行dotnet format应用格式化和 analyzer 修复、dotnet build确认改动后仍可编译、dotnet test --no-build行为变更后重跑最近的测试项目Stop以大规模 C# 变更结束会话前跑一次最终dotnet build对修改过的appsettings*.json发出警告避免把密钥提交进仓库。限制与注意规则文件是分层结构rules/common/定义通用默认值rules/csharp/在语言惯用法不同处覆盖它们冲突时语言特定规则优先见 rules/README.md 的 Rule Priority 一节。reviewer agent 的 Framework Checks 针对 ASP.NET Core、EF Core、Minimal APIs、Blazoragent 文档的 Reference 部分还指向一个dotnet-patterns技能用于更细的 C# 模式仓库内实际存在的是csharp-testing技能即本文第二节引用的文件。规则文件只对其 frontmatterpaths匹配的文件生效.cs/.csx之外的文件不会被这套 C# 规则约束。【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。