2016-09-07 3 views
0

DI를 사용하여 해결할 수있는 간단한 시나리오가 있지만 적절한 예제/문서를 찾을 수 없습니다. 나는 스칼라/Guice 세계에 처음이다.Scala Guice에서 종속성 삽입 - 매개 변수 전달

현재의 구성 요소는 내가 푸와 바 사이의 종속성이 지금이

trait Foo { 
} 

class FooImpl extends A { 

} 

trait Bar { 
    val description: String 
} 

class BarImpl(val description: String) extends Bar { 

} 

처럼 보인다. 그래서, 보통 코드는 createBar("Bar!") 단순히 new BarImpl("Random Bar Value")을 반환이

class FooImpl extends Foo { 
    Bar bar = createBar("Random Bar Value!") 
} 

과 같을 것이다. 물론 간결함을 위해 공장/도우미를 제거합니다.

내가 "새로운"것을 사용하는 순간, 이것은 DI 패러다임에서 벗어 났음을 알았습니다. Bar가 매개 변수를 기반으로 FooImpl에 주입 될 수 있는지 확인하고자합니다. 공장을 사용하는 것과 같습니다. Scala/Guice 세계에서 어떻게 DI를 사용합니까?

AssistedInjection/Named Parameters를 살펴 봤지만 사용법이 어떻게 될지 이해할 수 없었습니다. 나는 이것이 최선의 방법이라고 생각하지만, 어떻게 쓰고 테스트해야하는지 이해할 수 없었다.

답변

0

좋아, 그래서 이것이 결국 나를 위해 일한 것이다. Scala 기반 보조 주사를 다루고 자하는 모든 사람들을 위해이 단계를 다시 작성하십시오.

Foo는 Bar가 필요할 수 있지만 실제로 주사해야하는 것은 Bar가 아니라 BarFactory입니다.

BarFactory를 만들어야하지만 구현을 Guice에게 맡길 수 있습니다. 이것은 까다로워지는 곳입니다.

trait BarFactory { 
    def create(msg:String):Bar 
} 

그럼 푸과 바 방문하자 : 실제 공장을 만들기

@ImplementedBy(classOf[FooImpl]) 
trait Foo { 
    def getBar(msg: String): Bar 
} 

class FooImpl @Inject() (barFactory: BarFactory) extends Foo { 
    override def getBar(msg: String): Bar = { 
    barFactory.create(msg) 
    } 
} 

@ImplementedBy(classOf[BarImpl]) 
trait Bar { 
    def echo() : String 
} 

//Note that we use the @Assisted Annotation Here. 
class BarImpl @Inject() (@Assisted msg: String) extends Bar { 
    override def echo(): String = msg 
} 

class TempModule extends AbstractModule { 
    override def configure(): Unit = { 
    install(new FactoryModuleBuilder() 
     .implement(classOf[Bar], classOf[BarImpl]) 
     .build(classOf[BarFactory])) 
    } 
} 

그리고 한 번 시작 모듈의 일부로 수행되고, 공장 구현을 제공 할 것입니다 Guice, 그리고 Factory를 사용하여 실제 구현을 만들 수 있어야합니다.