2014-12-23 1 views
1

Dependency Injection을 위해 Subcut을 프로젝트에 통합하려고하는데 타사 라이브러리와 통합 할 때 문제가 발생합니다.Subcut을 사용하여 타사 라이브러리에 문자열 삽입

라이브러리에로드 할 파일의 위치가 필요하며 Play 구성에 저장하고있는 위치에 Subcut을 사용하여 삽입하려고합니다. 아래는 제가 현재 정의 된 모듈입니다 :

object ServerModule extends NewBindingModule (module => { 
import module._ 

bind[String] idBy 'location toSingle { 
    Play.current.configuration.getString("file.location").getOrElse (
    throw new IllegalStateException("Cannot find location") 
) 
} 

bind[ThirdPartyLib] toSingle { 
    val location = inject [String] (Some('location.toString)) 
    ThirdPartyLib fromFile location 
} 

bind[Controller] toProvider { implicit module => new Controller}}) 

이 코드는 컴파일하지만 런타임에 그것이 'location로 식별되는 위치 문자열 바인딩을 찾을 수 없다는 실패합니다.

또 다른 이유는 내가 왜 idBy 'location을 할 수 있는지 이해하지 못하고 inject[T]('location)을 수행하면 컴파일이 실패하게됩니까? 코드를 보면 idBy은 Symbol을 String으로 변환 한 다음 inject 메서드는 String 만 취합니다. 이것은 Subcut API의 결함일까요? 아니면 제가 잘못하고있는 것입니까?

답변

0

바인딩 식별자에 Symbols를 사용하는 문제가 있음을 발견했습니다. 나는 BindingId을 사용하는 솔루션을 위해 그들을 바꿨고 모든 것이 작동했습니다 :

object BindingKeys { 
    object Location extends BindingId 
} 

object ServerModule extends NewBindingModule (module => { 
    import module._ 
    import BindingKeys._ 

    bind[String] idBy Location toSingle { 
    Play.current.configuration.getString("file.location").getOrElse (
     throw new IllegalStateException("Cannot find file") 
    ) 
    } 

    bind[ThirdPartyLib] toProvider { implicit module => 
     val libLocation = inject [String] (Some(Location)) 
     ThirdPartyLib fromFile libLocation 
    } 

    bind[Controller] toProvider { implicit module => new Controller}}) 
관련 문제