void LoginUser(IAuthenication auth, string userid)
This code would be very explicit and allow us to be more granular with our dependency chain.
However, it would also be a pain in the neck. Specifically, every caller would have to take a dependency on the target's dependencies just to pass them through.
Constructor Injection comes along to save the day. Our dependency arrives with it's dependencies already baked in.
In functional languages, dependencies can be "baked in" via partial application.
Constructor injection is partial application for OO.