Claude-skills dotnet-core-expert
Use when building .NET 8 applications with minimal APIs, clean architecture, or cloud-native microservices. Invoke for Entity Framework Core, CQRS with MediatR, JWT authentication, AOT compilation.
install
source · Clone the upstream repo
git clone https://github.com/Jeffallan/claude-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Jeffallan/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/dotnet-core-expert" ~/.claude/skills/jeffallan-claude-skills-dotnet-core-expert-2fedab && rm -rf "$T"
manifest:
skills/dotnet-core-expert/SKILL.mdsource content
.NET Core Expert
Core Workflow
- Analyze requirements — Identify architecture pattern, data models, API design
- Design solution — Create clean architecture layers with proper separation
- Implement — Write high-performance code with modern C# features; run
to verify compilation — if build fails, review errors, fix issues, and rebuild before proceedingdotnet build - Secure — Add authentication, authorization, and security best practices
- Test — Write comprehensive tests with xUnit and integration testing; run
to confirm all tests pass — if tests fail, diagnose failures, fix the implementation, and re-run before continuing; verify endpoints withdotnet test
or a REST clientcurl
Reference Guide
Load detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| Minimal APIs | | Creating endpoints, routing, middleware |
| Clean Architecture | | CQRS, MediatR, layers, DI patterns |
| Entity Framework | | DbContext, migrations, relationships |
| Authentication | | JWT, Identity, authorization policies |
| Cloud-Native | | Docker, health checks, configuration |
Constraints
MUST DO
- Use .NET 8 and C# 12 features
- Enable nullable reference types:
in the<Nullable>enable</Nullable>.csproj - Use async/await for all I/O operations — e.g.,
await dbContext.Users.ToListAsync() - Implement proper dependency injection
- Use record types for DTOs — e.g.,
public record UserDto(int Id, string Name); - Follow clean architecture principles
- Write integration tests with
WebApplicationFactory<Program> - Configure OpenAPI/Swagger documentation
MUST NOT DO
- Use synchronous I/O operations
- Expose entities directly in API responses
- Skip input validation
- Use legacy .NET Framework patterns
- Mix concerns across architectural layers
- Use deprecated EF Core patterns
Code Examples
Minimal API Endpoint
// Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly)); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(); app.MapGet("/users/{id}", async (int id, ISender sender, CancellationToken ct) => { var result = await sender.Send(new GetUserQuery(id), ct); return result is null ? Results.NotFound() : Results.Ok(result); }) .WithName("GetUser") .Produces<UserDto>() .ProducesProblem(404); app.Run();
MediatR Query Handler
// Application/Users/GetUserQuery.cs public record GetUserQuery(int Id) : IRequest<UserDto?>; public sealed class GetUserQueryHandler : IRequestHandler<GetUserQuery, UserDto?> { private readonly AppDbContext _db; public GetUserQueryHandler(AppDbContext db) => _db = db; public async Task<UserDto?> Handle(GetUserQuery request, CancellationToken ct) => await _db.Users .AsNoTracking() .Where(u => u.Id == request.Id) .Select(u => new UserDto(u.Id, u.Name)) .FirstOrDefaultAsync(ct); }
EF Core DbContext with Async Query
// Infrastructure/AppDbContext.cs public sealed class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options) { public DbSet<User> Users => Set<User>(); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); } } // Usage in a service public async Task<IReadOnlyList<UserDto>> GetAllAsync(CancellationToken ct) => await _db.Users .AsNoTracking() .Select(u => new UserDto(u.Id, u.Name)) .ToListAsync(ct);
DTO with Record Type
public record UserDto(int Id, string Name); public record CreateUserRequest(string Name, string Email);
Output Templates
When implementing .NET features, provide:
- Project structure (solution/project files)
- Domain models and DTOs
- API endpoints or service implementations
- Database context and migrations if applicable
- Brief explanation of architectural decisions