5

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?

dratewka
  • 2,104
  • 14
  • 15

1 Answers1

7

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 ...
1esha
  • 1,722
  • 11
  • 17
  • 4
    But that means that it's not possible to create multiple instances of `AlsoNeedsFoo` (inside `RequiresFoo`). Is that correct? – dratewka Feb 25 '14 at 08:36