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 - CancellationToken: propagazione, timeout, linked token, anti-pattern
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
Pattern
- Strategy:
IEnumerable<T>per selezione a runtime, Keyed Services per selezione dichiarativa
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
Esempi
- Serilog su database (EF): sink custom per scrivere eccezioni su DB via Entity Framework
- HTTP audit log: middleware per registrare request/response su DB, con modellazione e considerazioni operative