C# / ASP.NET Core
Convenzioni, pattern e riferimenti tecnici per lo sviluppo con C# e ASP.NET Core.
Contenuto
- Switch expression e pattern matching — switch expression, pattern matching, when guard
- Rate limiting —
Microsoft.AspNetCore.RateLimiting, policy, sliding window - Feature flag —
Microsoft.FeatureManagement, flag condizionali, targeting - Logging —
ILogger<T>, Serilog, sink, log strutturati - Osservabilità — OpenTelemetry, trace, metriche, health checks
- Configurazione tipizzata —
IOptions<T>,IOptionsMonitor<T>, validazione - Code native .NET —
Queue<T>,ConcurrentQueue<T>,Channel<T> - Librerie per code e job — Hangfire, Quartz.NET
- Middleware custom — pipeline,
RequestDelegate, gestione errori globale - Action filter —
IActionFilter,IAsyncActionFilter - Authorization filter —
IAuthorizationFilter, API key, tenant - Exception filter —
IExceptionFilter,IAsyncExceptionFilter - Problem Details (RFC 9457) — errori strutturati,
ProblemDetails,ValidationProblemDetails - Async / Await — throughput nelle Web API,
CancellationToken, anti-pattern - Dependency Injection — lifetimes, captive dependency, keyed services
- HttpClient / IHttpClientFactory — typed client, DelegatingHandler, socket exhaustion
- Validazione — DataAnnotations, FluentValidation, ValidationProblemDetails
- Background services —
BackgroundService, worker pattern, graceful shutdown - Caching —
IMemoryCache,IDistributedCache, output caching - Resilienza — retry, circuit breaker, timeout con
Microsoft.Extensions.Http.Resilience - Records e immutabilità —
record,withexpression, DTO e value object
Struttura della Solution
- Struttura fisica — filesystem, .sln, .csproj, naming assembly e namespace
- Dipendenze tra progetti — Core, Db, Api, Tests e direzione delle dipendenze
- Organizzazione di Core — Screaming Architecture, dominio vs tipo tecnico
- UseCases — livello intermedio, comandi completi, SaveChanges, Result pattern
- Convenzioni — naming esplicito, un file per classe, record, interfacce, Program.cs
- Progetti di integrazione — client HTTP/SOAP, librerie esterne, confinamento delle dipendenze
- Models — DTO, enum di dominio, Result<T>, tipi condivisi tra progetti
Entity Framework
- Code First — Setup e migration — DbContext, registrazione, Fluent API, migration CLI
- IQueryable vs List — esecuzione differita, N+1, AsNoTracking
- LINQ con Entity Framework — proiezioni, paginazione, Include, SQL grezzo
Test unitari
- A cosa servono — logica pura, monitoraggio librerie di terze parti, verifica di comportamenti puntuali
Test di integrazione
- Pattern: template e scope — classe base NUnit, clone da template, scope DI per test
- Scrivere un test —
Get<T>(),SeedAsync, FluentAssertions, parallelismo - Testcontainers — PostgreSQL in Docker, nessuna dipendenza locale