Idiomatic dependency injection for ZIO applications in Scala

From the article:

I often hear online in Scala-related discussions that ZLayer is "too complex" or "unnecessary". Those statements couldn’t be more different from my own experience: I think ZLayer is an incredible lifesaver! While it is true that it had some issues in earlier versions of ZIO (those who remember the Has datatype know what I’m talking about!), a number of major improvements have been made since. In this article, I will show idiomatic usage of ZLayer for dependency injection and hope to demonstrate how it allows doing complex things in a very simple way.