irahardianto / dotnet-idioms
.NET 8+ framework architecture: Minimal APIs, EF Core data access, IOptions configuration, middleware pipelines, and WebApplicationFactory testing. Use when building ASP.NET Core services, Web APIs, or .NET cloud backends. Pair with csharp-idioms.
.NET Idioms and Patterns
.NET 8+ rewards minimal APIs, DI, and async-first design. Idiomatic .NET = clean, performant, cloud-native.
Scope: .NET framework patterns. For C#:
@.agents/skills/csharp-idioms/SKILL.md.
Minimal APIs
Minimal APIs for simple endpoints:
`csharp
app.MapGet("/api/tasks/{id}", async (string id, ITaskService service) =>
await service.GetByIdAsync(id) is Task task
? Results.Ok(task)
: Results.NotFound());app.MapPost("/api/tasks", async (CreateTaskRequest request, ITaskService service) =>
{
var task = await service.CreateAsync(request);
return Results.Created($"/api/tasks/{task.Id}", task);
});`- Controllers for complex endpoints with filters, model binding, etc.
Entity Framework Core
- DbContext per request (scoped lifetime).
Migrations via CLI:
`bash
dotnet ef migrations add AddTaskPriority
dotnet ef database update`AsNoTracking()for read-only queries.- Compiled queries for hot paths.
Configuration
IOptions<T>pattern for strongly-typed config:`csharp
builder.Services.Configure<DatabaseOptions>(builder.Configuration.GetSection("Database"));`- User secrets for local development, Key Vault for production.
Middleware
- Custom middleware for cross-cutting concerns (logging, correlation IDs).
UseExceptionHandlerfor global error handling.
Testing
For universal testing principles, see
.agents/rules/testing-strategy.md. Below: language-specific patterns only.
xUnit + FluentAssertions:
`csharp
[Fact]
public async Task GetTaskReturnsOkWhenExists()
{
var client = _factory.CreateClient();
var response = await client.GetAsync("/api/tasks/1");
response.StatusCode.Should().Be(HttpStatusCode.OK);
}`WebApplicationFactory<T>for integration tests.- Respawn for database cleanup.
Formatting and Static Analysis
| Tool | Purpose | Command |
|---|---|---|
dotnet format | Formatting | dotnet format |
| Roslyn analyzers | Analysis | Built-in |
dotnet list package --vulnerable | CVE scanning | Built-in |
Related
- C# Idioms @.agents/skills/csharp-idioms/SKILL.md
- API Design Principles @.agents/rules/api-design-principles.md
- Database Design Principles @.agents/rules/database-design-principles.md