Ali Hamza Ansari

Ali Hamza Ansari

Meet Ali, a talented .NET developer from Pakistan. Besides blogging, Ali works for a range of international customers doing everything from C# to Azure.

65 posts
How .NET handles exceptions internally (and why they're expensive)

Benchmarks .NET exception handling with BenchmarkDotNet across 100,000 iterations, comparing a no-exception baseline, a try/catch path throwing InvalidOperationException, and a OneOf<T> discriminated-union return type to quantify the CLR's stack-unwinding and heap-allocation overhead. ...

Designing business rules that don't leak into controllers

Refactors a fat ASP.NET Core OrdersController that enforces a five-orders-per-day rule directly inside CreateOrder into a testable IOrderService/OrderService pair, showing how moving validation like user-activity checks and order limits out of the controller keeps it thin and SRP-compliant. ...

When NOT to use the repository pattern in EF Core

Builds an IMovieRepository/MovieRepository/MovieService layer around EF Core's DbContext with a GetTopRatedAsync(8.0) query, then argues the abstraction pays off only for complex domains like banking or insurance, while simple CRUD apps are often better served by DbContext directly. ...

Why IEnumerable Can Kill Performance in Hot Paths

Benchmarks IEnumerable against List, arrays, LINQ chains, and yield-based sequences in C# using BenchmarkDotNet with collection sizes of 1,000 and 100,000, showing how deferred execution and repeated enumeration can make IEnumerable up to 7x slower than a materialized List in hot paths. ...

Polymorphic Relationships in EF Core: Three Approaches

Compares EF Core's Table-per-Hierarchy, Table-per-Type, and Table-per-Concrete-Type inheritance strategies using an abstract Employee base class with Contractor, FullTimeEmployee, and PartTimeEmployee subtypes, configuring TPH with HasDiscriminator<EmployeeTypeEnum> to store every row in one table. ...

Implementing strongly-typed IDs in .NET for safer domain models

Uses a PostgreSQL-backed EF Core project with Player, Team, and PlayerTeam entities to show how primitive obsession with plain int IDs lets a TeamId slip in where a PlayerId is expected, then wraps each ID in a strongly-typed struct so mixing them up becomes a compile-time error. ...

New in .NET 10 and C# 14: Multi-Tenant Rate Limiting

Builds a multi-tenant rate limiter in a .NET 10 LTS Web API using the native RateLimitPartition.GetTokenBucketLimiter, a TenantResolver that reads the X-Tenant-ID header, and per-tenant token bucket policies returning 429 Too Many Requests once a tenant's plan-based request limit is exceeded. ...

New in .NET 10 and C# 14: Fast Model Validation for APIs

Benchmarks a CreateDeviceRequest DTO validated with DataAnnotations like Required and Range across identical .NET 8 and .NET 10 Web APIs using BenchmarkDotNet and HttpClient, showing how .NET 10's reflection-free validation metadata cuts request latency by roughly 3x on invalid payloads. ...

New in .NET 10 and C# 14: Enhancements in APIs Request/Response Pipeline

Compares a .NET 8 minimal API against a .NET 10 minimal API using BenchmarkDotNet, showing how static lambda route handlers eliminate closure allocations and how AllowOutOfOrderMetadataProperties speeds up JSON deserialization to cut a /weather endpoint's response time and GC pressure. ...