2011-08-11 2 views
2

저는 Scala를 사용하여 Android 용 게임을 작성하고 있습니다. 이제 Dick Wall의 새로운 Dependency Injection 프레임 워크 인 SubCut을 Android에서 작동 시키려고합니다.Android에서 SubCut (Scala DI) 사용

기본적으로 게임의 유일한 활동이며 응용 프로그램이 시작될 때 Android에 의해 자동으로 시작되는 android.app.Activity 확장 클래스가 있습니다. 이제는이 Activity 인스턴스가 SubCut에 의해 주입되도록해야합니다.

는 일반적으로 당신처럼 수행

implicit val bindingModule = ProjectConfiguration 
val topInstance = new DoStuffOnTheWeb("stuff", new Date()) 

또는

val topInstance = new DoStuffOnTheWeb("stuff", new Date())(ProjectConfiguration) 

하지만 문제는 활동이없는 내 코드에서, 안드로이드에 의해 인스턴스화되고있는 것입니다. 나는이 같은 것을 사용하여 시도 :

class MyGame()(val bindingModule:BindingModule = MyGameConfigurationModule) extends Activity with Injectable { 

을하지만 분명히 안드로이드로 이것을 인스턴스화하는 방법을 알고하지 않습니다 내가 지금 얻을 :

ERROR/AndroidRuntime(322): FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mycompany.android.mygame..... 

나는 "부트 스트랩"할 수있을 것이라는 생각을했다 RoboGuice가 Guice DI 프레임 워크에서 수행하는 것처럼 액티비티의 onCreate() 메서드에서 SubCut을 수행합니다 (해당 메서드에서 인젝터 인스턴스를 생성하고 매개 변수로 this을 전달 함)

다른 옵션은 자동 별 Activity를 수동으로 시작하고 Subcut에서 요구하는 암시 적 val을 사용하여 android.app.Application에서 수동으로 시작하십시오. 그러나 어쨌든 이것은 문제를 요구하는 것 같이 느껴집니다. (예, 저는 안드로이드 개발에 아주 새로운 것입니다.)

아이디어가 있으십니까?

답변

4

글쎄, 내 머리 꼭대기에서 아마도 가장 좋은 옵션은 믹스 인 기반의 솔루션으로 바인딩 모듈을 대신 제공하는 것입니다.

trait ProjectBindings { 
    implicit val bindingModule: BindingModule = MyGameConfigurationModule 
} 

을 다음 주 특성과 함께이을의 믹스 : 당신은 아주 쉽게 할 수있는이 내가 당신이에 후크 할 수 개찰구와 같은 프레임 워크와 함께 사용하는 기술입니다

class MyGame extends Injectable with ProjectBindings { 
    // ... 
} 

많은 번거 로움없이 새로운 인스턴스를 생성하므로 안드로이드 활동 유스 케이스에서도 작동해야한다고 생각합니다. 나는 그것이 가능한지 알기를 바랍니다. 물론이 접근법의 문제점은 재구성과 관련하여 매우 유연하지 않기 때문에 카레 시도 생성자 매개 변수 접근법에서 암시 적 val을 선호하는 이유입니다.하지만 잘 작동합니다.

희망이 있습니다.

+0

간단하고 아름답게 작동합니다. 감사합니다. – vertti