news 2026/9/15 21:17:38

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

作者头像

张小明

前端开发工程师

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

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(专家)角色,scopeimplementation(面向实现),输出格式为代码。其 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-designerdatabase-optimizerdevops-engineer,分别用于补齐 API 契约设计、数据库调优与部署运维环节。

核心工作流:从分析到测试的五步闭环

技能规定了一个固定顺序的五步工作流,这也是 validate-skills.py 中CoreWorkflowStepCountChecker校验的约定结构(源码强制每个 SKILL.md 恰好包含 5 个编号步骤):

  1. Analyze solution(分析解决方案)——审阅.csproj文件、NuGet 包清单与整体架构,确定依赖关系与模块边界;
  2. Design models(设计模型)——产出领域模型、DTO 与校验规则;
  3. Implement(实现)——编写端点、仓储、服务,并通过 DI 完成装配;
  4. Optimize(优化)——应用异步模式、缓存与性能调优;
  5. 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 namespaceC# 10namespace MyApp;
主构造函数(Primary constructors)C# 12class Service(ILogger logger)
必填成员(Required members)C# 11public required string Name { get; init; }
原始字符串字面量(Raw string literals)C# 11var s = """ multi-line """;
列表模式(List patterns)C# 11[1, 2, .., var last]
集合表达式(Collection expressions)C# 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 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();

注意中间件顺序:UseHttpsRedirectionUseAuthenticationUseAuthorization,认证必须先于授权注册。

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>实现固定窗口限流,PermitLimitWindow等参数可按分区配置;
  • 健康检查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 对象引用。参考文件完整列出了六个生命周期回调(OnInitializedOnParametersSetShouldRenderOnAfterRender及其 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)租用缓冲区,在finallyReturn,避免每次 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)]标注被测方法,对比SubstringSpanSpan + stackalloc三种实现的分配与耗时,以数据驱动优化决策,避免凭直觉微优化。

查询与响应层优化

EF 侧复用 AsNoTracking、Include、编译查询与分页(Skip/Take+ 总数统计);API 侧启用AddResponseCompression(Brotli + Gzip)与CacheOutput。Native AOT 场景给出.csproj关键配置:<PublishAot>true</PublishAot><InvariantGlobalization>true</InvariantGlobalization><JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>

输出模板与知识清单

技能要求每次实现 .NET 功能时交付固定五件套:

  1. 领域模型与 DTO;
  2. API 端点(Minimal API 或 Controller);
  3. 仓储/服务实现;
  4. 配置(Program.cs、appsettings.json);
  5. 架构决策的简要说明。

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 中的descriptionmetadata.triggers即可作为自动触发信号。仓库提供的 validate-skills.py 会对每个 SKILL.md 执行结构校验,包括 frontmatter 必填字段、metadata子字段、references 目录存在性与引用路径可解析性——这意味着skills/csharp-developer/下的五个 reference 文件与 SKILL.md 中的链接必须保持路径一致,这也是本文所有引用均以仓库根为基准展开的原因。

实际使用时,可以像 SKILLS_GUIDE.md 推荐的组合那样,将csharp-developerapi-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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 21:15:16

AI驱动的列车制动系统气密性智能检测技术解析

1. 项目背景与核心价值列车制动系统作为轨道交通安全的最后一道防线&#xff0c;其气密性检测直接关系到整车的制动性能和运营安全。传统检测报告审核主要依赖人工目视检查&#xff0c;存在效率低&#xff08;单份报告平均审核耗时45分钟&#xff09;、漏检率高&#xff08;关键…

作者头像 李华
网站建设 2026/9/15 21:15:03

中小工厂MES选型对比:用友、金蝶、鼎捷哪家更合适?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 21:14:56

在c盘做网站可以吗老手揭秘避坑指南

在c盘做网站可以吗老手揭秘避坑指南 昨天凌晨两点,我接到一个急电。电话那头声音颤抖:“我的网站被黑挂了马,打开全是赌博广告,客户全跑了,现在该怎么办?”…

作者头像 李华
网站建设 2026/9/15 21:12:41

vibe coding:构建零中断的开发者工作流

1. “vibe coding”不是玄学&#xff0c;是开发者对工作流主权的重新夺回最近在几个技术社区里&#xff0c;频繁看到“vibe coding”这个词被反复提起——不是作为某个新框架或工具的代号&#xff0c;而是一种被集体确认的工作状态&#xff1a;写代码时心流稳定、节奏可控、环境…

作者头像 李华
网站建设 2026/9/15 21:11:07

Java进阶自学路线:从并发JVM到框架源码的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 21:10:19

清单来了:2026最新AI论文网站测评与推荐清单

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

作者头像 李华