Start here. This is the direct spoken answer to practice first.
Why this question matters
The built-in container supports several implementations, but selection needs to be intentional. Otherwise adding one registration can silently change which implementation a consumer receives.
When the same service type is registered several times, resolving IEnumerable<TService> returns all registrations in registration order. Resolving one TService normally returns the last registration. I use the enumerable when the consumer genuinely applies a pipeline or fan-out over every implementation. When one implementation must be selected from a runtime key, I use keyed services or a small typed factory with an explicit set of supported choices.