在Android上使用SubCut(Scala DI)

时间:2011-08-11 16:12:20

标签: android scala android-activity dependency-injection

我正在用Scala为Android编写游戏。现在我正试图让Dick Wall的新Dependency Injection框架SubCut在Android上运行。

基本上我有一个扩展android.app.Activity的课程,这是游戏的唯一活动,并在应用程序启动时由Android自动启动。现在我需要让SubCut注入这个Activity实例。

通常你会这样做:

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

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

但问题是Activity是由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使用Guice DI框架(它在该方法中创建一个注入器实例并传递它{{1}作为参数。

我想到的其他选项是,如果我可以跳过Activity的自动启动并使用Subcut所需的隐式val从this手动启动它。但不知怎的,这就像是在寻找麻烦(是的,我对android开发很新)。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

嗯,在我的头顶,也许这里最好的选择是使用基于mixin的解决方案来提供绑定模块。你可以很容易地做到这一点:

trait ProjectBindings {
  implicit val bindingModule: BindingModule = MyGameConfigurationModule
}

然后将其与可注射性状混合在一起:

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

这是我使用wicket等框架的技术,你不能在没有太多麻烦的情况下挂钩创建新实例,所以我相信它也适用于Android活动用例。我很想知道它是否确实如此。当然,这种方法的问题在于它在重新配置方面不是很灵活,这就是为什么我更喜欢curried构造函数参数方法中的隐式val,但它确实可以正常工作。

希望有所帮助。

迪克