2011-08-11 40 views
2

我正在爲Scala編寫Android遊戲。現在我試圖讓Dick Wall的新的依賴注入框架SubCut在Android上工作。Android上使用SubCut(Scala DI)

基本上我有一個類延伸android.app.Activity,這是遊戲的唯一活動,並在應用程序啓動時由Android自動啓動。現在我需要讓這個Activity實例被SubCut注入。

通常你不喜歡它:

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

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

但問題是,該活動由Android實例化,而不是從我的代碼。我試圖用這樣的:

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

但顯然Android不知道如何實例化這個,因爲我現在得到:

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

我在想,是否有可能「引導」在活動的onCreate()方法在某種程度上SubCut,作爲RoboGuice與吉斯DI框架做(它在方法創建一個噴油器實例,並將它this作爲參數。

我想到了其他的選擇是,如果我可以跳過自動星並使用Subcut所需的隱式val從android.app.Application中手動啓動它。但不知何故,這感覺就像要求麻煩(是的,我對android開發很陌生)。

任何想法?

回答

4

那麼,在我的頭頂,也許這裏最好的選擇是使用基於mixin的解決方案來提供綁定模塊。你可以這樣做很容易地:

trait ProjectBindings { 
    implicit val bindingModule: BindingModule = MyGameConfigurationModule 
} 

,然後用注射特質一起混合這:

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

這是我與像小門,你不能掛接到框架使用的技術創建新的實例沒有很多麻煩,所以我相信它也應該適用於Android活動用例。我很想知道它是否有效。當然,這種方法的問題在於它在重新配置方面不夠靈活,這就是爲什麼我更喜歡curried構造函數參數方法中的隱式val,但它確實工作得很好。

希望有所幫助。

迪克

+0

簡單,工作得很漂亮,謝謝! – vertti