资讯动态

claude-skills 之 C Developer:基于 .NET 8 构建高性能 Web API、EF Core 数据层与 Blazor 前端的一站式实践指南

发布时间:2026/9/15 21:17:38 来源:尧图企业网站定制
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-skillsclaude-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 配置数据访问使用 BlazorServer / WASM构建 Web 应用使用 SpanT、MemoryT 优化 .NET 性能使用 MediatR 落地 CQRS 架构配置认证与授权。技能还声明了三个 related-skillsapi-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.GetRequiredServiceAppDbContext(); 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 constructorC# 12例如public class ProductService(IProductRepository repository, ILoggerProductService logger)配合构造器注入省去冗余字段声明所有 I/O 一律 async/await并始终接收、转发CancellationTokenapp.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 ResultT(T? Value, string? Error, bool IsSuccess) { public static ResultT Ok(T value) new(value, null, true); public static ResultT Fail(string error) new(default, error, false); }使用强类型配置IOptionsT而不是字符串键散落各处。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 namespaceC# 10namespace MyApp;主构造函数Primary constructorsC# 12class Service(ILogger logger)必填成员Required membersC# 11public required string Name { get; init; }原始字符串字面量Raw string literalsC# 11var s multi-line ;列表模式List patternsC# 11[1, 2, .., var last]集合表达式Collection expressionsC# 12int[] x [1, 2, 3];Init-only 属性C# 9public string Name { get; init; }Record 类型C# 9record 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}} } ;集合表达式与 spreadint[] 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 ResultT { public record Success(T Value) : ResultT; public record Failure(string Error) : ResultT; }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.AddDbContextAppDbContext(options options.UseSqlServer(builder.Configuration.GetConnectionString(Default))); builder.Services.AddScopedIProductRepository, ProductRepository(); builder.Services.AddScopedProductService(); 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) .ProducesListProductDto(); group.MapPost(/, CreateProduct) .ProducesProductDto(201) .ProducesValidationProblem();Endpoint Filter 做校验IEndpointFilter允许把校验逻辑做成可复用的中间层配合 FluentValidationpublic class ValidationFilterT : IEndpointFilter where T : class { public async ValueTaskobject? InvokeAsync( EndpointFilterInvocationContext context, EndpointFilterDelegate next) { var request context.Arguments.OfTypeT().FirstOrDefault(); if (request is null) return Results.BadRequest(Invalid request); var validator context.HttpContext.RequestServices.GetServiceIValidatorT(); 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) .AddEndpointFilterValidationFilterCreateProductRequest();DI 生命周期与 Keyed Services.NET 8参考手册用一张速查表明确了选择依据生命周期适用场景存活期Scoped请求级状态DbContext、仓储每个 HTTP 请求Singleton全局共享状态缓存整个应用生命周期Transient无状态操作邮件发送每次注入.NET 8 新增的 Keyed Services 让同一接口的多实现可按名称注入services.AddKeyedScopedINotificationService, EmailNotificationService(email); services.AddKeyedScopedINotificationService, SmsNotificationService(sms); public class NotificationController( [FromKeyedServices(email)] INotificationService emailService, [FromKeyedServices(sms)] INotificationService smsService)Options 强类型配置从appsettings.json到强类型配置类并叠加启动时校验builder.Services.AddOptionsJwtSettings() .BindConfiguration(JwtSettings) .ValidateDataAnnotations() .ValidateOnStart(); public class TokenService(IOptionsJwtSettings options) { private readonly JwtSettings _settings options.Value; }认证授权、异常处理与缓存限流JWT 认证AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(...)在TokenValidationParameters中开启ValidateIssuer / ValidateAudience / ValidateLifetime / ValidateIssuerSigningKey四项校验授权策略用RequireRole(Admin)或RequireClaim(email_verified, true)定义全局异常处理.NET 8app.UseExceptionHandler(...)内读取IExceptionHandlerFeature记录日志并按环境决定是否暴露异常详情统一返回 RFC 7807ProblemDetails输出缓存AddOutputCache支持基础策略与命名策略SetVaryByQuery(category, page)端点用.CacheOutput(Products)挂载限流.NET 7AddRateLimiterPartitionedRateLimiter.CreateHttpContext, string实现固定窗口限流PermitLimit、Window等参数可按分区配置健康检查AddHealthChecks().AddDbContextCheckAppDbContext()并把健康端点映射到/health便于负载均衡与 K8s 探针接入。EF Core 数据层模型、仓储、查询优化与迁移entity-framework.md 提供了数据层从建模到优化的完整套路。DbContext 与配置类分离推荐用ApplyConfigurationsFromAssembly自动装载所有IEntityTypeConfiguration实现并用全局查询过滤器实现软删除public class AppDbContext(DbContextOptionsAppDbContext options) : DbContext(options) { public DbSetProduct Products SetProduct(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); modelBuilder.EntityProduct() .HasQueryFilter(p !p.IsDeleted); } } public class ProductConfiguration : IEntityTypeConfigurationProduct { public void Configure(EntityTypeBuilderProduct 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局部更新可用AttachProperty(...).IsModified true避免全量加载。Blazor组件、状态与实时能力blazor.md 面向 Blazor Server / WASM 两种托管模型。组件基础与参数组件用page声明路由、inject注入服务、bind-Value做双向绑定。参数约定[Parameter, EditorRequired]声明必填入参如ProductDto ProductEventCallbackint是类型安全的子→父通信回调RenderFragment承载子内容插槽实现灵活布局。表单与校验EditFormDataAnnotationsValidatorValidationMessage组合实现声明式校验EditForm Modelmodel OnValidSubmitHandleValidSubmit DataAnnotationsValidator / ValidationSummary / InputText bind-Valuemodel.Name classform-control / ValidationMessage For(() model.Name) / /EditForm模型用[Required]、[StringLength(200)]、[Range(0.01, 999999.99)]描述约束保存按钮通过disabledisSaving防重复提交。状态管理与级联参数CascadingValue将共享状态如购物车注入整棵组件树配合事件订阅OnChange StateHasChanged实现响应式刷新认证状态用CascadingAuthenticationState包裹。JS Interop 与生命周期通过IJSRuntime.InvokeAsyncIJSObjectReference(import, ./js/mapComponent.js)动态加载 ES Module并在OnAfterRenderAsync(firstRender)中初始化记得实现IAsyncDisposable释放 JS 对象引用。参考文件完整列出了六个生命周期回调OnInitialized、OnParametersSet、ShouldRender、OnAfterRender及其 Async 版本的职责划分。授权、错误边界与虚拟化AuthorizeView按认证状态条件渲染页面级保护用attribute [Authorize(Roles Admin)]ErrorBoundary捕获渲染期异常并提供Recover()重试机制Virtualize ItemsProviderLoadProducts为超长列表提供懒加载虚拟化显著降低 DOM 压力SignalR 集成示例展示了HubConnectionBuilderWithAutomaticReconnect()建立实时通知通道的完整写法。性能优化Span、池化与基准测试performance.md 提供了可操作的优化清单下表是它的速查索引优化手段适用场景收益SpanT数组/字符串操作零分配ArrayPoolT临时缓冲区降低 GC 压力ValueTaskT频繁同步完成的路径更低分配ConfigureAwait(false)类库代码避免上下文捕获Frozen collections静态只读数据更快的查找AsNoTracking()只读查询更好的 EF 性能Object pooling重量级对象实例复用响应缓存静态响应降低服务器负载Native AOT启动时间敏感场景更快的冷启动零分配字符串处理对比示例Substring(...).ToUpper()每调用一次分配一个新字符串改用Spanchar buffer stackalloc char[10]; input[..10].ToUpperInvariant(buffer);后栈上完成大小写转换不产生托管堆分配。ArrayPool 与对象池流式读取大文件时ArrayPoolbyte.Shared.Rent(4096)租用缓冲区在finally中Return避免每次 4KB 数组的分配StringBuilder这类高频创建对象则通过自定义PooledObjectPolicy注册进 DI 复用。异步最佳实践命中缓存即可同步返回的场景使用ValueTaskT例如if (_cache.TryGetValue(key, out var value)) return ValueTask.FromResultstring?(value);类库中await后加.ConfigureAwait(false)避免同步上下文捕获除事件处理器外禁用async void独立无关的异步调用用Task.WhenAll并行化。BenchmarkDotNet 验证用[MemoryDiagnoser]与[Benchmark(Baseline true)]标注被测方法对比Substring、Span、Span stackalloc三种实现的分配与耗时以数据驱动优化决策避免凭直觉微优化。查询与响应层优化EF 侧复用 AsNoTracking、Include、编译查询与分页Skip/Take 总数统计API 侧启用AddResponseCompressionBrotli Gzip与CacheOutput。Native AOT 场景给出.csproj关键配置PublishAottrue/PublishAot、InvariantGlobalizationtrue/InvariantGlobalization、JsonSerializerIsReflectionEnabledByDefaultfalse/JsonSerializerIsReflectionEnabledByDefault。输出模板与知识清单技能要求每次实现 .NET 功能时交付固定五件套领域模型与 DTOAPI 端点Minimal API 或 Controller仓储/服务实现配置Program.cs、appsettings.json架构决策的简要说明。SKILL.md 末尾还给出了 Minimal API 完整示例含.WithName、.ProducesProductDto()、.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-engineerCI/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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价