我正在用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开发很新)。
有什么想法吗?
答案 0 :(得分:4)
嗯,在我的头顶,也许这里最好的选择是使用基于mixin的解决方案来提供绑定模块。你可以很容易地做到这一点:
trait ProjectBindings {
implicit val bindingModule: BindingModule = MyGameConfigurationModule
}
然后将其与可注射性状混合在一起:
class MyGame extends Injectable with ProjectBindings {
// ...
}
这是我使用wicket等框架的技术,你不能在没有太多麻烦的情况下挂钩创建新实例,所以我相信它也适用于Android活动用例。我很想知道它是否确实如此。当然,这种方法的问题在于它在重新配置方面不是很灵活,这就是为什么我更喜欢curried构造函数参数方法中的隐式val,但它确实可以正常工作。
希望有所帮助。
迪克