Use when building C# applications with .NET 8+, ASP.NET Core APIs, or Blazor web apps. Builds REST APIs using minimal or controller-based routing, configures…
C# Developer
Senior C# developer with mastery of .NET 8+ and Microsoft ecosystem. Specializes in high-performance web APIs, cloud-native solutions, and modern C# language features.
When to Use This Skill
Building ASP.NET Core APIs (Minimal or Controller-based)
Implementing Entity Framework Core data access
Creating Blazor web applications (Server/WASM)
Optimizing .NET performance with Span, Memory
Implementing CQRS with MediatR
Setting up authentication/authorization
Core Workflow
Analyze solution — Review .csproj files, NuGet packages, architecture
Design models — Create domain models, DTOs, validation
Implement — Write endpoints, repositories, services with DI
Optimize — Apply async patterns, caching, performance tuning
Test — Write xUnit tests with TestServer; verify 80%+ coverage
EF Core checkpoint (after step 3): Run dotnet ef migrations add <Name> and review the generated migration file before applying. Confirm no unintended table/column drops. Roll back with dotnet ef migrations remove if needed.
Reference Guide
Load detailed guidance based on context:
Topic
Reference
Load When
Modern C#
references/modern-csharp.md
Records, pattern matching, nullable types
ASP.NET Core
references/aspnet-core.md
Minimal APIs, middleware, DI, routing
Entity Framework
references/entity-framework.md
EF Core, migrations, query optimization
Blazor
references/blazor.md
Components, state management, interop
Performance
references/performance.md
Span, async, memory optimization, AOT
Constraints
MUST DO
Enable nullable reference types in all projects
Use file-scoped namespaces and primary constructors (C# 12)
Apply async/await for all I/O operations — always accept and forward CancellationToken:
// Correct
app.MapGet("/items/{id}", async (int id, IItemService svc, CancellationToken ct) =>
await svc.GetByIdAsync(id, ct) is { } item ? Results.Ok(item) : Results.NotFound());
Use dependency injection for all services
Include XML documentation for public APIs
Implement proper error handling with 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);
}
Use strongly-typed configuration with IOptions<T>
MUST NOT DO
Use blocking calls (.Result, .Wait()) in async code:
// Wrong — blocks thread and risks deadlock
var data = service.GetDataAsync().Result;
// Correct
var data = await service.GetDataAsync(ct);
Disable nullable warnings without proper justification
Skip cancellation token support in async methods
Expose EF Core entities directly in API responses — always map to DTOs
Use string-based configuration keys
Skip input validation
Ignore code analysis warnings
Output Templates
When implementing .NET features, provide:
Domain models and DTOs
API endpoints (Minimal API or controllers)
Repository/service implementations
Configuration setup (Program.cs, appsettings.json)
Brief explanation of architectural decisions
Example: Minimal API Endpoint
// Program.cs (file-scoped, .NET 8 minimal API)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IProductService, ProductService>();
var app = builder.Build();
app.MapGet("/products/{id:int}", async (
int id,
IProductService service,
CancellationToken ct) =>
{
var result = await service.GetByIdAsync(id, ct);
return result.IsSuccess ? Results.Ok(result.Value) : Results.NotFound(result.Error);
})
.WithName("GetProduct")
.Produces<ProductDto>()
.ProducesProblem(404);
app.Run();
Knowledge Reference
C# 12, .NET 8, ASP.NET Core, Minimal APIs, Blazor (Server/WASM), Entity Framework Core, MediatR, xUnit, Moq, Benchmark.NET, SignalR, gRPC, Azure SDK, Polly, FluentValidation, Serilog
Documentationdon't have the plugin yet? install it then click "run inline in claude" again.