Lifetimes
A lifetime decides how long an instance lives and how often it is built. Awaiten has three, and you pick one per registration.
Factories and instances
Most services are built by their constructor, and Awaiten calls it for you. Sometimes that is not enough. You need a bit of logic to build the service, or you already have the object in hand. That is what factories and instances are for.
Decorators
A decorator wraps a service in another that shares its interface. It is how you add logging, retries, or caching without touching the real implementation. The consumer asks for the interface and gets the wrapped version. It cannot tell the difference, and it cannot bypass the wrapper.
Composites
A composite is one service that stands in for many. The consumer asks for a single service, and behind it the composite fans the call out to every other implementation. It is the classic way to treat "notify the customer on all channels" as one call.
Keyed services
Sometimes one service type has several implementations and you want to pick a specific one by name. The milk fridge holds oat, whole, and soy. They are all IMilk, but a recipe asks for one in particular. Keys let you register them side by side, and the container picks the right one for each consumer, so the consumer stays a plain class.
Open generics
A generic service like IRepository usually has one generic implementation like Repository. You do not want to register it once per entity type. Register the open generic once, and Awaiten closes it for each type your app actually uses.
Scanning
Some sets of services grow over time. Every drink on the menu implements IDrink. You do not want to add a registration line each time you add a drink. A scan registers every type that matches a marker, and it does it at compile time by reading metadata, so there is still no runtime reflection.
Modules
A module is a reusable bundle of registrations. It lets you group everything for payments, or for the seasonal menu, and drop it into a container with one line. Modules can live in other assemblies, so a shared library can ship its own wiring.