Question

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?

Was it helpful?

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 ...
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top