claude-skills 之 C# Developer:基于 .NET 8 构建高性能 Web API、EF Core 数据层与 Blazor 前端的一站式实践指南
【免费下载链接】claude-skills67 Specialized Skills for Full-Stack Developers. Transform Claude Code into your expert pair programmer.项目地址: https://gitcode.com/GitHub_Trending/claud/claude-skills
claude-skills 仓库中的 C# Developer 技能 是一份将 Claude Code 训练为资深 .NET 工程师的操作手册,覆盖 .NET 8+、ASP.NET Core、Entity Framework Core、Blazor 与性能优化的完整开发链路。本文以该技能文档为骨架,结合仓库内 modern-csharp.md、aspnet-core.md、entity-framework.md、blazor.md、performance.md 五份参考手册逐层展开,帮助你在实际项目中落地一套可复制、可运行、可测试的 .NET 工程范式。
技能定位与触发时机
在 claude-skills 的 67 项技能体系中,csharp-developer属于 language(语言)域下的 specialist(专家)角色,scope为implementation(面向实现),输出格式为代码。其 frontmatter 中定义的 triggers 为:C#、.NET、ASP.NET Core、Blazor、Entity Framework、EF Core、Minimal API、MAUI、SignalR,意味着当 Claude Code 面对这些关键词时即可自动加载该技能。
从 SKILLS_GUIDE.md 的决策树看,它在仓库中的定位是 "Enterprise .NET"(企业级 .NET)场景的默认选择。技能描述明确其在"构建 C# 应用时的使用边界":
- 使用 Minimal API 或 Controller 方式构建 REST API;
- 使用 Entity Framework Core 配置数据访问;
- 使用 Blazor(Server / WASM)构建 Web 应用;
- 使用 Span<T>、Memory<T> 优化 .NET 性能;
- 使用 MediatR 落地 CQRS 架构;
- 配置认证与授权。
技能还声明了三个 related-skills:api-designer、database-optimizer、devops-engineer,分别用于补齐 API 契约设计、数据库调优与部署运维环节。
核心工作流:从分析到测试的五步闭环
技能规定了一个固定顺序的五步工作流,这也是 validate-skills.py 中CoreWorkflowStepCountChecker校验的约定结构(源码强制每个 SKILL.md 恰好包含 5 个编号步骤):
- Analyze solution(分析解决方案)——审阅
.csproj文件、NuGet 包清单与整体架构,确定依赖关系与模块边界; - Design models(设计模型)——产出领域模型、DTO 与校验规则;
- Implement(实现)——编写端点、仓储、服务,并通过 DI 完成装配;
- Optimize(优化)——应用异步模式、缓存与性能调优;
- Test(测试)——使用 xUnit +
TestServer编写测试,目标覆盖率 80% 以上。
其中步骤 3 完成后有一个强制性的EF Core checkpoint:必须先执行dotnet ef migrations add <Name>生成迁移,并审阅生成的迁移文件,确认没有意外的表/列删除后再应用;若发现问题,用dotnet ef migrations remove回滚。这一检查点与 entity-framework.md 中列出的迁移命令相互印证:
dotnet ef migrations add InitialCreate # 生成迁移 dotnet ef database update # 应用到数据库 dotnet ef migrations script # 导出 SQL 脚本 dotnet ef migrations remove # 移除未应用的最后一个迁移 dotnet ef database update PreviousMigrationName # 回滚到指定迁移在 CI/CD 或容器启动场景,也可以改用编程方式应用迁移:
public static async Task ApplyMigrationsAsync(IServiceProvider services) { using var scope = services.CreateScope(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); await context.Database.MigrateAsync(); }必须遵守与必须避免:技能内置的代码规范
SKILL.md 以 MUST DO / MUST NOT DO 两个清单硬性约束生成代码的质量红线,这些约束在五个参考手册中均有展开,是整份文档中最具"可执行性"的部分。
MUST DO(必须做到)
- 所有项目启用 nullable reference types,并用
required修饰符(C# 11)表达必填成员,例如public required string Email { get; init; }; - 使用 file-scoped namespace 与 primary constructor(C# 12),例如
public class ProductService(IProductRepository repository, ILogger<ProductService> logger),配合构造器注入省去冗余字段声明; - 所有 I/O 一律 async/await,并始终接收、转发
CancellationToken:
app.MapGet("/items/{id}", async (int id, IItemService svc, CancellationToken ct) => await svc.GetByIdAsync(id, ct) is { } item ? Results.Ok(item) : Results.NotFound());- 所有服务通过依赖注入(DI)提供,生命周期选择见下文;
- 公共 API 添加 XML 文档注释;
- 使用 Result pattern 做错误处理,将成功值、错误信息与状态封装在同一个类型中:
public readonly record struct Result<T>(T? Value, string? Error, bool IsSuccess) { public static Result<T> Ok(T value) => new(value, null, true); public static Result<T> Fail(string error) => new(default, error, false); }- 使用强类型配置
IOptions<T>,而不是字符串键散落各处。
MUST NOT DO(严禁行为)
技能以"错误写法 + 正确写法"对照的方式给出反面教材,其中最典型的是异步阻塞:
// Wrong — blocks thread and risks deadlock var data = service.GetDataAsync().Result; // Correct var data = await service.GetDataAsync(ct);其余红线包括:无正当理由禁用 nullable 警告、异步方法跳过 CancellationToken、直接把 EF Core 实体暴露给 API 响应(必须映射为 DTO)、使用字符串配置键、跳过输入校验、忽略代码分析警告。这些约束共同构成了代码审查时的自动化检查项。
现代 C# 语言特性:C# 11 / C# 12 的表达力
modern-csharp.md 按语言版本汇总了这份技能偏好使用的语法特性:
| 特性 | C# 版本 | 示例 |
|---|---|---|
| File-scoped namespace | C# 10 | namespace MyApp; |
| 主构造函数(Primary constructors) | C# 12 | class Service(ILogger logger) |
| 必填成员(Required members) | C# 11 | public required string Name { get; init; } |
| 原始字符串字面量(Raw string literals) | C# 11 | var s = """ multi-line """; |
| 列表模式(List patterns) | C# 11 | [1, 2, .., var last] |
| 集合表达式(Collection expressions) | C# 12 | int[] x = [1, 2, 3]; |
| Init-only 属性 | C# 9 | public string Name { get; init; } |
| Record 类型 | C# 9 | record Person(string Name); |
几个直接改善可读性与安全性的实用模式:
- Record + 模式匹配:record 的
with表达式天然支持不可变更新;switch 表达式可写出可读性极高的分支逻辑:
public decimal CalculateDiscount(Customer customer, Order order) => customer switch { { Id: > 1000 } => order.Total * 0.2m, // Premium customer { Name: "VIP" } => order.Total * 0.3m, // VIP _ when order.Total > 500 => order.Total * 0.1m, // Large order _ => 0m };- 原始字符串 + 插值:拼接 JSON 或 SQL 模板时不再需要转义地狱:
var productJson = $$""" { "id": {{product.Id}}, "name": "{{product.Name}}", "price": {{product.Price}} } """;- 集合表达式与 spread:
int[] moreNumbers = [..numbers, 6, 7, 8];,配合 .NET 8 的 Frozen 集合(ToFrozenDictionary())为只读静态数据提供更快的查询性能; - 使用 record 实现可辨识联合(discriminated union):以抽象 record 派生
Success(T Value)/Failure(string Error),再配合 switch 模式匹配实现穷尽处理,是 Result pattern 的更严格形态:
public abstract record Result<T> { public record Success(T Value) : Result<T>; public record Failure(string Error) : Result<T>; }- JsonSerializer 源生成(
[JsonSerializable(typeof(Product))])为 Native AOT 做准备,避免反射带来的启动开销。
ASP.NET Core 实战:Minimal API 到生产级加固
aspnet-core.md 覆盖了 API 从搭建到加固的全过程。
Minimal API 初始化与中间件管线
// Program.cs using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Default"))); builder.Services.AddScoped<IProductRepository, ProductRepository>(); builder.Services.AddScoped<ProductService>(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.MapProductEndpoints(); app.Run();注意中间件顺序:UseHttpsRedirection→UseAuthentication→UseAuthorization,认证必须先于授权注册。
Route Group 组织端点
将 CRUD 端点收敛到MapGroup,统一配置标签、鉴权与返回类型,避免端点散落:
var group = app.MapGroup("/api/products") .WithTags("Products") .RequireAuthorization(); group.MapGet("/", GetAllProducts) .WithName("GetProducts") .Produces<List<ProductDto>>(); group.MapPost("/", CreateProduct) .Produces<ProductDto>(201) .ProducesValidationProblem();Endpoint Filter 做校验
IEndpointFilter允许把校验逻辑做成可复用的中间层,配合 FluentValidation:
public class ValidationFilter<T> : IEndpointFilter where T : class { public async ValueTask<object?> InvokeAsync( EndpointFilterInvocationContext context, EndpointFilterDelegate next) { var request = context.Arguments.OfType<T>().FirstOrDefault(); if (request is null) return Results.BadRequest("Invalid request"); var validator = context.HttpContext.RequestServices.GetService<IValidator<T>>(); if (validator is not null) { var result = await validator.ValidateAsync(request); if (!result.IsValid) return Results.ValidationProblem(result.ToDictionary()); } return await next(context); } } // 挂载到端点 group.MapPost("/", CreateProduct) .AddEndpointFilter<ValidationFilter<CreateProductRequest>>();DI 生命周期与 Keyed Services(.NET 8)
参考手册用一张速查表明确了选择依据:
| 生命周期 | 适用场景 | 存活期 |
|---|---|---|
| Scoped | 请求级状态(DbContext、仓储) | 每个 HTTP 请求 |
| Singleton | 全局共享状态(缓存) | 整个应用生命周期 |
| Transient | 无状态操作(邮件发送) | 每次注入 |
.NET 8 新增的 Keyed Services 让同一接口的多实现可按名称注入:
services.AddKeyedScoped<INotificationService, EmailNotificationService>("email"); services.AddKeyedScoped<INotificationService, SmsNotificationService>("sms"); public class NotificationController( [FromKeyedServices("email")] INotificationService emailService, [FromKeyedServices("sms")] INotificationService smsService)Options 强类型配置
从appsettings.json到强类型配置类,并叠加启动时校验:
builder.Services.AddOptions<JwtSettings>() .BindConfiguration("JwtSettings") .ValidateDataAnnotations() .ValidateOnStart(); public class TokenService(IOptions<JwtSettings> options) { private readonly JwtSettings _settings = options.Value; }认证授权、异常处理与缓存限流
- JWT 认证:
AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(...),在TokenValidationParameters中开启ValidateIssuer / ValidateAudience / ValidateLifetime / ValidateIssuerSigningKey四项校验;授权策略用RequireRole("Admin")或RequireClaim("email_verified", "true")定义; - 全局异常处理(.NET 8):
app.UseExceptionHandler(...)内读取IExceptionHandlerFeature,记录日志并按环境决定是否暴露异常详情,统一返回 RFC 7807ProblemDetails; - 输出缓存:
AddOutputCache支持基础策略与命名策略(SetVaryByQuery("category", "page")),端点用.CacheOutput("Products")挂载; - 限流(.NET 7+):
AddRateLimiter+PartitionedRateLimiter.Create<HttpContext, string>实现固定窗口限流,PermitLimit、Window等参数可按分区配置; - 健康检查:
AddHealthChecks().AddDbContextCheck<AppDbContext>()并把健康端点映射到/health,便于负载均衡与 K8s 探针接入。
EF Core 数据层:模型、仓储、查询优化与迁移
entity-framework.md 提供了数据层从建模到优化的完整套路。
DbContext 与配置类分离
推荐用ApplyConfigurationsFromAssembly自动装载所有IEntityTypeConfiguration实现,并用全局查询过滤器实现软删除:
public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options) { public DbSet<Product> Products => Set<Product>(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); modelBuilder.Entity<Product>() .HasQueryFilter(p => !p.IsDeleted); } } public class ProductConfiguration : IEntityTypeConfiguration<Product> { public void Configure(EntityTypeBuilder<Product> builder) { builder.ToTable("Products"); builder.HasKey(p => p.Id); builder.Property(p => p.Name).IsRequired().HasMaxLength(200); builder.Property(p => p.Price).HasPrecision(18, 2); builder.HasIndex(p => p.Sku).IsUnique(); builder.HasOne(p => p.Category) .WithMany(c => c.Products) .HasForeignKey(p => p.CategoryId) .OnDelete(DeleteBehavior.Restrict); } }值对象通过OwnsOne映射为 owned type,字段约束内联配置。
Repository 模式与查询优化
通用仓储模板统一了增删改查接口,并在删除时利用查询过滤器实现软删除(置IsDeleted = true而非物理删除)。查询优化矩阵是这份参考的核心:
| 操作 | 方法 | 说明 |
|---|---|---|
| 只读查询 | .AsNoTracking() | 跳过变更跟踪,性能更好 |
| 预加载 | .Include() | 一次加载关联数据 |
| 过滤式 Include | .Include(x => x.Items.Where(...)) | .NET 5+ |
| 拆分查询 | .AsSplitQuery() | 避免笛卡尔爆炸 |
| 批量更新 | .ExecuteUpdateAsync() | .NET 7+,单条 SQL |
| 批量删除 | .ExecuteDeleteAsync() | .NET 7+ |
| 编译查询 | EF.CompileAsyncQuery() | 缓存查询计划,反复复用 |
典型的性能敏感写法——投影只取需要的列,避免整实体加载:
return await context.Products .AsNoTracking() .Select(p => new ProductSummaryDto { Id = p.Id, Name = p.Name, Price = p.Price, CategoryName = p.Category.Name, OrderCount = p.OrderItems.Count }) .ToListAsync(ct);事务、拦截器与变更跟踪
- 跨表写操作使用
BeginTransactionAsync/CommitAsync/RollbackAsync包裹; - 审计字段(
CreatedAt/UpdatedAt)可交给SaveChangesInterceptor统一维护,注册时用AddInterceptors(new AuditInterceptor()); - 高频只读场景直接设置
ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;局部更新可用Attach+Property(...).IsModified = true避免全量加载。
Blazor:组件、状态与实时能力
blazor.md 面向 Blazor Server / WASM 两种托管模型。
组件基础与参数
组件用@page声明路由、@inject注入服务、@bind-Value做双向绑定。参数约定:
[Parameter, EditorRequired]声明必填入参(如ProductDto Product);EventCallback<int>是类型安全的子→父通信回调;RenderFragment承载子内容插槽,实现灵活布局。
表单与校验
EditForm+DataAnnotationsValidator+ValidationMessage组合实现声明式校验:
<EditForm Model="@model" OnValidSubmit="@HandleValidSubmit"> <DataAnnotationsValidator /> <ValidationSummary /> <InputText @bind-Value="model.Name" class="form-control" /> <ValidationMessage For="@(() => model.Name)" /> </EditForm>模型用[Required]、[StringLength(200)]、[Range(0.01, 999999.99)]描述约束,保存按钮通过disabled="@isSaving"防重复提交。
状态管理与级联参数
CascadingValue将共享状态(如购物车)注入整棵组件树,配合事件订阅OnChange += StateHasChanged实现响应式刷新;认证状态用CascadingAuthenticationState包裹。
JS Interop 与生命周期
通过IJSRuntime.InvokeAsync<IJSObjectReference>("import", "./js/mapComponent.js")动态加载 ES Module,并在OnAfterRenderAsync(firstRender)中初始化;记得实现IAsyncDisposable释放 JS 对象引用。参考文件完整列出了六个生命周期回调(OnInitialized、OnParametersSet、ShouldRender、OnAfterRender及其 Async 版本)的职责划分。
授权、错误边界与虚拟化
AuthorizeView按认证状态条件渲染;页面级保护用@attribute [Authorize(Roles = "Admin")];<ErrorBoundary>捕获渲染期异常并提供Recover()重试机制;<Virtualize ItemsProvider="@LoadProducts">为超长列表提供懒加载虚拟化,显著降低 DOM 压力;- SignalR 集成示例展示了
HubConnectionBuilder+WithAutomaticReconnect()建立实时通知通道的完整写法。
性能优化:Span、池化与基准测试
performance.md 提供了可操作的优化清单,下表是它的速查索引:
| 优化手段 | 适用场景 | 收益 |
|---|---|---|
Span<T> | 数组/字符串操作 | 零分配 |
ArrayPool<T> | 临时缓冲区 | 降低 GC 压力 |
ValueTask<T> | 频繁同步完成的路径 | 更低分配 |
ConfigureAwait(false) | 类库代码 | 避免上下文捕获 |
| Frozen collections | 静态只读数据 | 更快的查找 |
AsNoTracking() | 只读查询 | 更好的 EF 性能 |
| Object pooling | 重量级对象 | 实例复用 |
| 响应缓存 | 静态响应 | 降低服务器负载 |
| Native AOT | 启动时间敏感场景 | 更快的冷启动 |
零分配字符串处理
对比示例:Substring(...).ToUpper()每调用一次分配一个新字符串;改用Span<char> buffer = stackalloc char[10]; input[..10].ToUpperInvariant(buffer);后,栈上完成大小写转换,不产生托管堆分配。
ArrayPool 与对象池
流式读取大文件时ArrayPool<byte>.Shared.Rent(4096)租用缓冲区,在finally中Return,避免每次 4KB 数组的分配;StringBuilder这类高频创建对象则通过自定义PooledObjectPolicy注册进 DI 复用。
异步最佳实践
- 命中缓存即可同步返回的场景使用
ValueTask<T>,例如if (_cache.TryGetValue(key, out var value)) return ValueTask.FromResult<string?>(value);; - 类库中
await后加.ConfigureAwait(false)避免同步上下文捕获; - 除事件处理器外禁用
async void; - 独立无关的异步调用用
Task.WhenAll并行化。
BenchmarkDotNet 验证
用[MemoryDiagnoser]与[Benchmark(Baseline = true)]标注被测方法,对比Substring、Span、Span + stackalloc三种实现的分配与耗时,以数据驱动优化决策,避免凭直觉微优化。
查询与响应层优化
EF 侧复用 AsNoTracking、Include、编译查询与分页(Skip/Take+ 总数统计);API 侧启用AddResponseCompression(Brotli + Gzip)与CacheOutput。Native AOT 场景给出.csproj关键配置:<PublishAot>true</PublishAot>、<InvariantGlobalization>true</InvariantGlobalization>、<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>。
输出模板与知识清单
技能要求每次实现 .NET 功能时交付固定五件套:
- 领域模型与 DTO;
- API 端点(Minimal API 或 Controller);
- 仓储/服务实现;
- 配置(Program.cs、appsettings.json);
- 架构决策的简要说明。
SKILL.md 末尾还给出了 Minimal API 完整示例(含.WithName、.Produces<ProductDto>()、.ProducesProblem(404)的 OpenAPI 元数据链),以及覆盖 C# 12、.NET 8、ASP.NET Core、Minimal APIs、Blazor、EF Core、MediatR、xUnit、Moq、Benchmark.NET、SignalR、gRPC、Azure SDK、Polly、FluentValidation、Serilog 的知识参考范围。
如何在 claude-skills 中使用本技能
安装与启用遵循仓库统一流程(详见 QUICKSTART.md):将skills/目录加入 Claude Code 的 skills 配置路径后,技能 frontmatter 中的description与metadata.triggers即可作为自动触发信号。仓库提供的 validate-skills.py 会对每个 SKILL.md 执行结构校验,包括 frontmatter 必填字段、metadata子字段、references 目录存在性与引用路径可解析性——这意味着skills/csharp-developer/下的五个 reference 文件与 SKILL.md 中的链接必须保持路径一致,这也是本文所有引用均以仓库根为基准展开的原因。
实际使用时,可以像 SKILLS_GUIDE.md 推荐的组合那样,将csharp-developer与api-designer(契约先行)、database-optimizer(索引与查询调优)、test-master(测试策略)、devops-engineer(CI/CD 与容器化)串联成一条从建模到上线的完整流水线。
小结
csharp-developer 技能的价值在于把"资深 .NET 工程师的经验"固化成机器可读、可重复执行的约束与参考:五步工作流规定了开发顺序,MUST DO / MUST NOT DO 划定了质量红线,五个参考手册则覆盖现代语言特性、API 开发、数据层、前端组件与性能调优五个维度。对开发者而言,它既是一份可交给 Agent 执行的操作规范,也是一份可以对照自查的 .NET 8 工程化清单。若需要更深入的数据库专项调优或部署实践,可继续翻阅仓库中的 database-optimizer 与 devops-engineer 技能。
【免费下载链接】claude-skills67 Specialized Skills for Full-Stack Developers. Transform Claude Code into your expert pair programmer.项目地址: https://gitcode.com/GitHub_Trending/claud/claude-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考