scalacake-pattern

Transitive DI using cake pattern


I'm trying to do dependency injection using the cake pattern like so:

trait FooComponent {
  val foo: Foo

  trait Foo;
}

trait AlsoNeedsFoo {
  this: FooComponent =>
}

trait RequiresFoo {
  this: FooComponent =>

  val a = new AlsoNeedsFoo with FooComponent{
    val foo: this.type#Foo = RequiresFoo.this.foo
  }

}

but the compiler complains that the RequiresFoo.this.type#Foo doesn't conform to the expected type this.type#Foo.

So the question: is it possible to create a AlsoNeedsFoo object inside RequiresFoo so that dependency injection works properly?


Solution

  • With cake pattern you should not instantiate other components, but extends them.

    In your case you if you need functionality of AlsoNeedsFoo you should write something like this:

    this: FooComponent with AlsoNeedsFoo with ... =>
    

    And put all together on top level:

    val app = MyImpl extends FooComponent with AlsoNeedsFoo with RequiresFoo with ...