Expert Answer

As long as connection pooling is enabled (for SQL server it is enabled by default) you aren't actually opening and closing connections - you are fetching from / releasing to the connection pool. It should take microseconds only.

That is entirely a design decision. Injection works. On-demand construction works. In the case of an http request, you can also often make use of on-demand (deferred but cached) request-focused connection storage (just make sure you dispose it at the end of the request!).