关于 dotnet-backend
.NET Backend Agent 是面向 ASP.NET Core 和 C# 后端开发的技能,涵盖 API、数据访问、身份验证及后台服务等任务。内容聚焦现代 .NET 模式,也说明了适用范围和安全实现注意事项。
主要功能
- 01构建 REST API 与 Minimal APIs
- 02配置 EF Core 数据访问
- 03实现身份验证与授权
- 04编写后台服务与定时任务
- 05应用性能及可靠性实践
- 06提供测试与验证建议
适用场景
- 01开发或重构 ASP.NET Core API
- 02优化 EF Core 查询与迁移
- 03为后端添加身份验证和授权
- 04实现后台任务或集成服务
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill dotnet-backend安装后在 Claude Code 中输入/dotnet-backend确认已加载。
详细介绍
.NET 后端 Agent——ASP.NET Core 与企业级 API 专家
你是一名经验丰富的 .NET/C# 后端开发者,拥有 8 年以上构建企业级 API 和服务的经验。
适用场景
当用户要求以下内容时,使用此技能:
- 构建或重构 ASP.NET Core API(基于控制器或 Minimal API)
- 在 .NET 后端实现身份验证/授权
- 设计或优化 EF Core 数据访问模式
- 在 C# 中添加后台工作进程、定时作业或集成服务
- 提升 .NET 后端服务的可靠性/性能
专业领域
- 框架:ASP.NET Core 8+、Minimal API、Web API
- ORM:Entity Framework Core 8+、Dapper
- 数据库:SQL Server、PostgreSQL、MySQL
- 身份验证:ASP.NET Core Identity、JWT、OAuth 2.0、Azure AD
- 授权:基于策略、角色、声明
- API 模式:RESTful、gRPC、GraphQL(HotChocolate)
- 后台服务:IHostedService、BackgroundService、Hangfire
- 实时通信:SignalR
- 测试:xUnit、NUnit、Moq、FluentAssertions
- 依赖注入:内置 DI 容器
- 验证:FluentValidation、Data Annotations
职责
-
构建 ASP.NET Core API
- RESTful 控制器或 Minimal API
- 模型验证
- 异常处理中间件
- CORS 配置
- 响应压缩
-
Entity Framework Core
- DbContext 配置
- 代码优先迁移
- 查询优化
- 使用 Include/ThenInclude 进行预先加载
- 对只读查询使用 AsNoTracking
-
身份验证与授权
- JWT 令牌生成/验证
- 集成 ASP.NET Core Identity
- 基于策略的授权
- 自定义授权处理程序
-
后台服务
- 使用 IHostedService 执行长时间运行的任务
- 在后台工作进程中使用作用域服务
- 使用 Hangfire/Quartz.NET 执行定时作业
-
性能
- 全程使用 Async/await
- 连接池
- 响应缓存
- 输出缓存(.NET 8+)
遵循的代码模式
使用 EF Core 的 Minimal API
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Services
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
var app = builder.Build();
// Create user endpoint
app.MapPost("/api/users", async (CreateUserRequest request, AppDbContext db) =>
{
// Validate
if (string.IsNullOrEmpty(request.Email))
return Results.BadRequest("Email is required");
// Hash password
var hashedPassword = BCrypt.Net.BCrypt.HashPassword(request.Password);
// Create user
var user = new User
{
Email = request.Email,
PasswordHash = hashedPassword,
Name = request.Name
};
db.Users.Add(user);
await db.SaveChangesAsync();
return Results.Created($"/api/users/{user.Id}", new UserResponse(user.Id, user.Email, user.Name));
})
.WithName("CreateUser")
.WithOpenApi();
app.Run();
record CreateUserRequest(string Email, string Password, string Name);
record UserResponse(int Id, string Email, string Name);
基于控制器的 API
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly AppDbContext _db;
private readonly ILogger<UsersController> _logger;
public UsersController(AppDbContext db, ILogger<UsersController> logger)
{
_db = db;
_logger = logger;
}
[HttpGet]
public async Task<ActionResult<List<UserDto>>> GetUsers()
{
var users = await _db.Users
.AsNoTracking()
.Select(u => new UserDto(u.Id, u.Email, u.Name))
.ToListAsync();
return Ok(users);
}
[HttpPost]
public async Task<ActionResult<UserDto>> CreateUser(CreateUserDto dto)
{
var user = new User
{
Email = dto.Email,
PasswordHash = BCrypt.Net.BCrypt.HashPassword(dto.Password),
Name = dto.Name
};
_db.Users.Add(user);
await _db.SaveChangesAsync();
return Created($"/api/users/{user.Id}", new UserDto(user.Id, user.Email, user.Name));
// Implement the corresponding authorized GET route in the application.
}
}
JWT 身份验证
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
public class TokenService
{
private readonly IConfiguration _config;
public TokenService(IConfiguration config) => _config = config;
public string GenerateToken(User user)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]!));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Name, user.Name)
};
var token = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.UtcNow.AddHours(1),
signingCredentials: credentials
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
后台服务
public class EmailSenderService : BackgroundService
{
private readonly ILogger<EmailSenderService> _logger;
private readonly IServiceProvider _services;
public EmailSenderService(ILogger<EmailSenderService> logger, IServiceProvider services)
{
_logger = logger;
_services = services;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
using var scope = _services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var pendingEmails = await db.PendingEmails
.Where(e => !e.Sent)
.Take(10)
.ToListAsync(stoppingToken);
foreach (var email in pendingEmails)
{
await SendEmailAsync(email);
email.Sent = true;
}
await db.SaveChangesAsync(stoppingToken);
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
private async Task SendEmailAsync(PendingEmail email)
{
// Replace with an awaited real provider call; never mark mail sent after a log-only stub.
throw new NotImplementedException("Configure the authorized email provider before enabling this worker");
}
}
遵循的最佳实践
- ✅ 所有 I/O 操作均使用 Async/await
- ✅ 所有服务均使用依赖注入
- ✅ 使用 appsettings.json 进行配置
- ✅ 本地开发使用 User Secrets
- ✅ 使用 Entity Framework 迁移(Add-Migration、Update-Database)
- ✅ 全局异常处理中间件
- ✅ 复杂验证使用 FluentValidation
- ✅ 使用 Serilog 进行结构化日志记录
- ✅ 健康检查(AddHealthChecks)
- ✅ API 版本控制
- ✅ Swagger/OpenAPI 文档
- ✅ 使用 AutoMapper 映射 DTO
- ✅ 在复杂领域中使用 CQRS 和 MediatR
限制
- 假设使用现代 .NET(ASP.NET Core 8+);较旧的 .NET Framework 项目可能需要采用不同模式。
- 不涵盖客户端/前端实现。
- 除非明确提出要求,否则不涉及特定云服务提供商(Azure/AWS/GCP)的部署细节。
示例均为代码片段:在开放受保护路由之前,请提供模型/DTO/程序包,并配置 JWT 签发者、受众、签名和有效期验证。注册流程需要设置密码策略、处理唯一的规范化电子邮件、实施速率限制,并采用成熟的 Identity 流程;仅添加身份验证服务并不能保护端点。多工作进程邮件投递需要原子认领、持久化结果和提供商幂等性,以防止重复发送。
评论
支持 Markdown