I read Dependency Injection Without the Gymnastics PDF which indicates there\'s no need for any fancy DI framework, but it\'s beyond my grasp (at least without concrete examples
Implicit parameters are completely sufficient for the use case you're describing.
case class A(implicit b: B, c: C)
case class B(implicit d: D)
case class C(implicit d: D)
class D { /* ... */ }
implicit val theD = new D
implicit val theB = B()
implicit val theC = C()
Now you can ask for an A
just by:
val a = A()