Skip to content
Kumar Chandrachooda
Series

The Framework Before the Framework

In reading order.

  • 16 parts
  • ≈ 80 min total
  • 16 published
Part 1 22 Jul 2025 6 min read

The Framework Before the Framework

DShop.Common is the shared library nine microservices were built on - and the rough draft of a framework its authors later shipped as Convey.

Part 2 28 Jul 2025 5 min read

Queue Names Are the Whole Topology

One naming class in DShop.Common decides every exchange, routing key and queue in the estate - the message topology is a string-formatting problem.

Part 3 04 Aug 2025 5 min read

Command or Event, Enforced by Convention

In DShop.Common a command and an event are published by identical code - the difference between them is a marker interface and a promise nothing enforces.

Part 4 10 Aug 2025 5 min read

The Envelope That Scrambled Itself

DShop.Common's correlation context threads request identity through every message hop - and a long positional argument list quietly transposes half its fields.

Part 5 17 Aug 2025 5 min read

Rejected Events — a Two-Lane Error Taxonomy

DShop.Common decides a message's fate from the type of exception a handler throws - domain failures become events, infrastructure failures get retried.

Part 6 24 Aug 2025 5 min read

The Retry Path Nobody Took

A complete broker-requeue retry implementation sits in DShop.Common's subscriber, fully written and never called - and its comment explains exactly why.

Part 7 30 Aug 2025 5 min read

What the Framework Doesn't Have

An audit of the messaging patterns DShop.Common leaves out - no outbox, no inbox, no consumed dead-letter - and how each absence became a Convey package.

Part 8 06 Sep 2025 4 min read

Hand-Rolled MediatR in Thirty Lines

DShop.Common ships its own in-process command and query dispatch - marker interfaces, a handler triple, and one dynamic double-dispatch standing in for a library.

Part 9 12 Sep 2025 5 min read

The Fluent Handler That Explodes on Success

A reusable try-catch-finally wrapper in DShop.Common awaits a null-conditional delegate - so the success path throws a NullReferenceException the failure path avoids.

Part 10 19 Sep 2025 5 min read

Three Load Balancers Behind One Config String

DShop.Common picks client-side discovery, a router, or a static address from one word in JSON - and self-registers each service into Consul with a heartbeat lease.

Part 11 26 Sep 2025 4 min read

A Load Balancer With Amnesia

DShop.Common's Consul registry tracks which service instances it has used to spread load evenly - then registers as transient, discarding that memory on nearly every request.

Part 12 02 Oct 2025 4 min read

Writing to the Backing Field

DShop.Common stamps a server-generated Guid into an immutable command by reflecting into its compiler-generated backing field - immutability the type system only pretends to enforce.

Part 13 09 Oct 2025 5 min read

Every Error Is a 400 and Says Too Much

DShop.Common's error middleware maps every exception to HTTP 400, computes a safe message, then throws it away and serialises the raw exception text to the caller.

Part 14 16 Oct 2025 5 min read

Revoking the Irrevocable

DShop.Common makes a stateless JWT revocable with a Redis deny-list and a per-request round-trip - plus an iat claim in milliseconds and two validators that disagree.

Part 15 22 Oct 2025 6 min read

BuildServiceProvider Nine Times

Each concern in DShop.Common builds a throwaway DI container just to read config - nine per service, atop three coexisting container frameworks and a vendored config parser.

Part 16 29 Oct 2025 6 min read

The Rough Draft of Convey

A retrospective on DShop.Common - the frozen shared-contracts tombstone, a release candidate pinned forever, and a concordance of what Convey kept, renamed, and fixed.