Almost nothing on a real .NET project is written from scratch. You reach for a mapper, a validator, a logger, a scheduler, a message bus, and the interesting decisions are which one and how far to let it into your code.

Where two libraries do the same job we have usually compared them head to head instead of picking a favourite. The right answer moves with licence terms, with maintenance, and with what the rest of your stack already uses.

The sections group by the job, not by the package, so a mapper sits next to the other mapper and a message broker next to the other message broker.

Object Mapping

Copying values between a domain type and a DTO, and the argument about whether you should.

Validation

Rules that live beside the type instead of inside the controller.

MediatR, CQRS and In-Process Messaging

Sending a message to something in the same process, which is a smaller idea than the pattern names around it suggest.

Message Brokers and Distributed Messaging

Sending a message to another process, where delivery, ordering and failure all become your problem.

HTTP Client Libraries

Wrappers over HttpClient that trade a little control for a lot less boilerplate.

Dependency Injection Containers

The built-in container covers most cases. These are what you reach for when it does not.

JSON

Json.NET is still everywhere, and these are the jobs System.Text.Json makes you think about.

Code Quality and Documentation

Keeping a codebase consistent without arguing about it in every review.

Logging

Structured logging is the one thing here that pays for itself on the first incident.

OpenTelemetry and Observability

Traces, metrics and the vendor-neutral plumbing that carries them.

Data Access Libraries

Talking to a database without an ORM, and the smaller packages that sit beside one.

GraphQL

Both ends of it: serving a schema from ASP.NET Core, and consuming one.

Resilience and Scheduling

Retries, circuit breakers and jobs that need to run at three in the morning whether anyone is watching or not.

Images, PDFs and Documents

Producing a file a human will open, which is a surprisingly awkward corner of .NET.

Machine Learning and AI

ML.NET and the local-model experiments, for the times you would rather not call somebody else’s API.

Small Single-Job Packages

One package, one problem, usually solved in an afternoon and then never thought about again.

Where to Go Next

Where these libraries usually end up being wired in:

Before you let a library spread through the codebase, work out how you would take it out again. The ones worth adopting everywhere are the few whose absence you would notice on the first morning without them.