Design queue handlers for duplicate delivery

Assume a queue message can arrive more than once and make the handler’s business effects safe to repeat.

July 19, 2026 · 3 min · Lukas Walter

Validate structured model output before using it

Treat deserialized model output as untrusted data and apply normal business validation before it drives application behavior.

July 18, 2026 · 2 min · Lukas Walter

Use PeriodicTimer for cancellable asynchronous loops

Use PeriodicTimer when a background loop needs an awaitable cadence, cooperative shutdown, and sequential executions.

July 16, 2026 · 2 min · Lukas Walter

Validate required options at startup

Fail during application startup when required configuration is missing or invalid instead of waiting for the first request.

July 15, 2026 · 2 min · Lukas Walter

Use idempotency keys for retryable writes

Make a retried write replay the same operation instead of creating a duplicate side effect.

July 12, 2026 · 3 min · Lukas Walter

Make logs structured before adding dashboards

Capture queryable fields first so dashboards are built on data, not text search.

July 9, 2026 · 3 min · Lukas Walter

Use IHttpClientFactory

Create configured HttpClient instances through the factory instead of scattering clients and handlers.

July 8, 2026 · 2 min · Lukas Walter

Do not hide exceptions inside fire-and-forget tasks

If work can fail, give it ownership, logging, cancellation, and a lifecycle.

July 5, 2026 · 2 min · Lukas Walter

Nullable warnings are design feedback, not noise

Treat nullable warnings as pressure to make object state and API contracts clearer.

July 5, 2026 · 2 min · Lukas Walter

Pass CancellationToken through real boundaries

Thread cancellation through every expensive operation instead of dropping it mid-chain.

July 5, 2026 · 2 min · Lukas Walter