Authorisation Policies and Requirements in ASP.NET Core
Build fine-grained authorisation using policies, requirements, and handlers in ASP.NET Core for claims-based, resource-based, and role-based access control.
Shadow Properties in EF Core: Database Columns Without CLR Properties
How to use EF Core shadow properties to add database columns that don't appear on your entity classes, keeping your domain model clean.
Custom Authentication Handlers in ASP.NET Core
Build custom authentication handlers in ASP.NET Core for API key, HMAC, and token-based authentication schemes.
ArrayPool<T> and Memory Pooling in .NET
Use ArrayPool<T> and MemoryPool<T> to rent and return buffers, drastically cutting array allocations in high-throughput code.
Query Splitting: Taming the Cartesian Explosion in EF Core
How EF Core's split queries prevent cartesian explosion when loading multiple related collections, and when to use them.
OpenAPI and Swagger Generation in ASP.NET Core
Generate OpenAPI specifications from ASP.NET Core APIs using the built-in OpenAPI support and Swashbuckle, with customisation for schemas, security, and documentation.
Object Pooling with ObjectPool<T> in .NET
Reduce GC pressure and allocation overhead by reusing objects with Microsoft.Extensions.ObjectPool.
Change Tracking Deep Dive: How EF Core Knows What Changed
A deep dive into EF Core's change tracker, exploring how it detects modifications, the role of entity states, and strategies for optimising performance.
Minimal API Route Groups and Filters in ASP.NET Core
Organise minimal API endpoints with route groups and add cross-cutting behaviour with endpoint filters for validation, logging, and transformation.
Problem Details and RFC 9457 in ASP.NET Core
Use the Problem Details standard (RFC 9457) in ASP.NET Core to return consistent, machine-readable error responses from your APIs.
Custom Model Binders in ASP.NET Core
Build custom model binders in ASP.NET Core to handle non-standard parameter formats like comma-separated lists, composite keys, and smart parsing.
Content Negotiation in ASP.NET Core
How ASP.NET Core selects response formats using content negotiation, and how to add custom formatters for XML, CSV, and other media types.
API Versioning Strategies in ASP.NET Core
Implement URL, query string, header, and media type API versioning in ASP.NET Core using the Asp.Versioning packages.
Implicit Indexer Access in Object Initialisers
C# 13 allows the implicit 'from the end' index operator (^) inside object initialisers, completing index expression support.
Polly Resilience Pipelines in ASP.NET Core
Build fault-tolerant HTTP calls using Polly v8 resilience pipelines with retry, circuit breaker, timeout, and rate limiter strategies.
The \e Escape Sequence: First-Class Terminal Escape Codes in C#
C# 13 adds the \e escape sequence for the ESC character, making ANSI terminal formatting cleaner and less error-prone.
Typed HttpClient with HttpClientFactory in ASP.NET Core
Use IHttpClientFactory and typed clients to manage HTTP connections properly, avoiding socket exhaustion and DNS staling.
The Lock Object: A Purpose-Built Synchronisation Primitive
C# 13 introduces System.Threading.Lock, a dedicated type for the lock statement that improves performance and clarity.
Background Services with IHostedService and BackgroundService
Build long-running background tasks in ASP.NET Core using IHostedService and BackgroundService, with patterns for queued work, timed execution, and graceful shutdown.
Partial Properties: Completing the Partial Story
C# 13 extends partial members to include properties and indexers, enabling cleaner source generator patterns.
Custom Middleware Patterns in ASP.NET Core
How to build convention-based and factory-based middleware in ASP.NET Core, including branching, short-circuiting, and testability patterns.
Params Collections: Beyond Arrays with params
C# 13 extends the params keyword to work with any collection type including spans, lists, and custom collections.
Inline Arrays: Fixed-Size Buffers Without Unsafe Code
C# 12 inline arrays embed fixed-size buffers directly in structs, enabling stack-allocated collections without unsafe blocks.
Ref Readonly Parameters: Passing by Reference Without the Pitfalls
C# 12's ref readonly parameters offer a safe middle ground between in parameters and ref parameters for high-performance code.
Default Lambda Parameters: Optional Arguments in Anonymous Functions
C# 12 brings default parameter values to lambda expressions, aligning their capabilities with regular methods.