Search code examples
scalaguice

scala: how to inject inside guice module


i am new in guice here is my code

trait MyRepository

class MyRepositoryImp extends MyRepository

trait MyService

class MyServiceImp @Inject()(myRepository:MyRepository) extends MyService

class Demo @Inject(myService:MyService)

class RepositoryModule extends AbstractModule {

override protected def configure(): Unit = {
    bind(classOf[MyRepository]).toInstance(new MyRepositoryImpl)

  }
}

class ServiceModule extends AbstractModule {

override protected def configure(): Unit = {
    bind(classOf[MyService]).toInstance(new MyService(//what should i pass in here?))

  }
}

my question is in ServiceModule how can i pass the injected MyRepository param in MyService constructor


Solution

  • Try with @Provides annotation

    import com.google.inject.{AbstractModule, Guice, Inject, Injector, Provides}
    import scala.jdk.CollectionConverters._
    
    trait MyRepository {}
    class MyRepositoryImp extends MyRepository {}
    trait MyService {}
    class MyServiceImp @Inject() (myRepository: MyRepository) extends MyService {}
    class Demo @Inject() (myService: MyService) { println("Woohoo, I am wired!") }
    
    class Module extends AbstractModule {
      @Provides def repository: MyRepository = new MyRepositoryImp
      @Provides def service(repo: MyRepository): MyService = new MyServiceImp(repo)
      @Provides def demo(service: MyService): Demo = new Demo(service)
    }
    
    object guiceExample extends App {
      val injector: Injector = Guice.createInjector(List(new Module).asJava)
      val demo = injector.getInstance(classOf[Demo])
    }
    

    which outputs Woohoo, I am wired!.