Start here. This is the direct spoken answer to practice first.
Why this question matters
Constructor injection makes a type's requirements visible and valid when it is created. Service location hides those requirements behind runtime lookups and moves errors away from composition.
I prefer constructor injection because the class declares what it needs, the container validates the graph, and tests can provide dependencies directly. Calling IServiceProvider from business code hides dependencies, allows optional-looking null results, and can resolve services with the wrong lifetime. It also couples the code to the container instead of to the capability it uses.