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
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
1---2name: csharp-developer3description: 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 database access with Entity Framework Core, implements async patterns and cancellation, structures applications with CQRS via MediatR, and scaffolds Blazor components with state management. Invoke for C#, .NET, ASP.NET Core, Blazor, Entity Framework, EF Core, Minimal API, MAUI, SignalR.4license: MIT5---67# C# Developer89Senior C# developer with mastery of .NET 8+ and Microsoft ecosystem. Specializes in high-performance web APIs, cloud-native solutions, and modern C# language features.1011## When to Use This Skill1213- Building ASP.NET Core APIs (Minimal or Controller-based)14- Implementing Entity Framework Core data access15- Creating Blazor web applications (Server/WASM)16- Optimizing .NET performance with Span<T>, Memory<T>17- Implementing CQRS with MediatR18- Setting up authentication/authorization1920## Core Workflow21221. **Analyze solution** — Review .csproj files, NuGet packages, architecture232. **Design models** — Create domain models, DTOs, validation243. **Implement** — Write endpoints, repositories, services with DI254. **Optimize** — Apply async patterns, caching, performance tuning265. **Test** — Write xUnit tests with TestServer; verify 80%+ coverage2728> **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.2930## Reference Guide3132Load detailed guidance based on context:3334| Topic | Reference | Load When |35|-------|-----------|-----------|36| Modern C# | `references/modern-csharp.md` | Records, pattern matching, nullable types |37| ASP.NET Core | `references/aspnet-core.md` | Minimal APIs, middleware, DI, routing |38| Entity Framework | `references/entity-framework.md` | EF Core, migrations, query optimization |39| Blazor | `references/blazor.md` | Components, state management, interop |40| Performance | `references/performance.md` | Span<T>, async, memory optimization, AOT |4142## Constraints4344### MUST DO45- Enable nullable reference types in all projects46- Use file-scoped namespaces and primary constructors (C# 12)47- Apply async/await for all I/O operations — always accept and forward `CancellationToken`:48 ```csharp49 // Correct50 app.MapGet("/items/{id}", async (int id, IItemService svc, CancellationToken ct) =>51 await svc.GetByIdAsync(id, ct) is { } item ? Results.Ok(item) : Results.NotFound());52 ```53- Use dependency injection for all services54- Include XML documentation for public APIs55- Implement proper error handling with Result pattern:56 ```csharp57 public readonly record struct Result<T>(T? Value, string? Error, bool IsSuccess)58 {59 public static Result<T> Ok(T value) => new(value, null, true);60 public static Result<T> Fail(string error) => new(default, error, false);61 }62 ```63- Use strongly-typed configuration with `IOptions<T>`6465### MUST NOT DO66- Use blocking calls (`.Result`, `.Wait()`) in async code:67 ```csharp68 // Wrong — blocks thread and risks deadlock69 var data = service.GetDataAsync().Result;7071 // Correct72 var data = await service.GetDataAsync(ct);73 ```74- Disable nullable warnings without proper justification75- Skip cancellation token support in async methods76- Expose EF Core entities directly in API responses — always map to DTOs77- Use string-based configuration keys78- Skip input validation79- Ignore code analysis warnings8081## Output Templates8283When implementing .NET features, provide:841. Domain models and DTOs852. API endpoints (Minimal API or controllers)863. Repository/service implementations874. Configuration setup (Program.cs, appsettings.json)885. Brief explanation of architectural decisions8990## Example: Minimal API Endpoint9192```csharp93// Program.cs (file-scoped, .NET 8 minimal API)94var builder = WebApplication.CreateBuilder(args);95builder.Services.AddScoped<IProductService, ProductService>();9697var app = builder.Build();9899app.MapGet("/products/{id:int}", async (100 int id,101 IProductService service,102 CancellationToken ct) =>103{104 var result = await service.GetByIdAsync(id, ct);105 return result.IsSuccess ? Results.Ok(result.Value) : Results.NotFound(result.Error);106})107.WithName("GetProduct")108.Produces<ProductDto>()109.ProducesProblem(404);110111app.Run();112```113114## Knowledge Reference115116C# 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