Blog posts

2026

Domain Modeling in .NET: Aggregates, Value Objects, and Invariants

3 minute read

Published:

This post covers practical domain modeling in .NET using aggregates, value objects, and invariants. The goal is not to turn every app into a textbook DDD system. The goal is to put important business rules in places where they are hard to bypass.

Clean Architecture vs Vertical Slice in .NET: Pragmatic Guidance

3 minute read

Published:

This post compares two popular ways to structure .NET applications: Clean Architecture and Vertical Slice Architecture. Both can produce maintainable systems, and both can become over-engineered if applied mechanically. The useful question is not “which one is best?” The useful question is “which structure reduces change friction for this codebase?”

Resilience in .NET: HttpClientFactory, Polly Policies, Retries, and Timeouts

3 minute read

Published:

This post covers how .NET applications should call external services safely using HttpClientFactory, timeouts, retries, and resilience policies. Distributed systems fail in ordinary ways: networks pause, DNS changes, services restart, and dependencies return temporary errors. Resilience design assumes those failures will happen.

API Documentation in .NET: OpenAPI, Swagger, Examples, and Versioning

3 minute read

Published:

This post covers how to document ASP.NET Core APIs using OpenAPI, Swagger UI, examples, and version-aware contracts. Good API documentation is not decoration. It is how frontend developers, mobile teams, integration partners, and future maintainers understand what your API promises.

Caching in .NET: IMemoryCache, Distributed Cache with Redis, and Response Caching

3 minute read

Published:

This post covers the main caching options in .NET applications: in-memory cache, distributed cache, Redis, and HTTP response caching. Caching can reduce latency and database load, but it also introduces correctness questions. The hard part is not storing data. The hard part is knowing when cached data is valid.

Background Jobs in .NET: HostedService, BackgroundService, and Worker Services

3 minute read

Published:

This post covers the background processing options built into modern .NET applications. Web APIs handle request/response work, but real systems also need jobs that run outside a single HTTP request: queue consumers, scheduled cleanup, report generation, synchronization, and long-running workers.

Testing ASP.NET Core Apps: xUnit and Integration Tests with WebApplicationFactory

4 minute read

Published:

This post covers the two testing layers most .NET teams rely on heavily: unit tests with xUnit and integration tests with WebApplicationFactory. Unit tests give you fast feedback on isolated logic. Integration tests prove that your application actually boots, routes requests, resolves dependencies, and returns the expected HTTP responses.

EF Core Performance: AsNoTracking, Compiled Queries, and Split Queries

5 minute read

Published:

This post covers some of the most useful EF Core performance techniques you will apply in read-heavy applications: disable tracking for read-only queries, project only the data you need, use compiled queries for hot paths, and understand when split queries help avoid large join explosions. Performance work starts with measurement, but these patterns are worth knowing early.

EF Core Fundamentals: DbContext, Migrations, Tracking, and Relationships

4 minute read

Published:

This post covers the pieces of Entity Framework Core you need before building real data-backed applications. The essential model is: your entities represent data, DbContext coordinates access to that data, migrations evolve the schema, and change tracking decides what EF Core will insert, update, or delete.

Authorization in ASP.NET Core: Policies, Roles, Claims, and Resource-Based Access

3 minute read

Published:

This post covers the part of security that decides what an authenticated user is allowed to do. In ASP.NET Core, authorization usually builds on roles, claims, named policies, and sometimes resource-specific checks performed in code. If authentication answers “who are you?”, authorization answers “may you do this?”.