https://nvkhuy.com/posts/dependency-injection-vs-dependency-inversion/