Используйте SubCut (Scala DI) на Android - PullRequest
2 голосов
/ 11 августа 2011

Я пишу игру для Android со Scala.Теперь я пытаюсь заставить новую платформу DeCence Wall от Dick Wall работать на Android.

По сути, у меня есть класс, расширяющий 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.....

Я думал, можно ли будет«загрузить» SubCut каким-либо образом в методе onCreate () действия, как это делает RoboGuice со структурой Guice DI (он создает экземпляр инжектора в этом методе и передает его this в качестве параметра.

Другой вариант, который я думалПримерно было бы, если бы я мог пропустить автоматический запуск Activity и вручную запустить его с android.app.Application с неявным val, требуемым Subcut. Но почему-то это похоже на возникновение проблемы (и да, я очень новичок в разработке для Android).

Есть идеи?

1 Ответ

4 голосов
/ 13 августа 2011

Ну, в общем, возможно, лучшим вариантом здесь было бы пойти на решение на основе миксинов для обеспечения связующего модуля.Вы можете сделать это довольно легко:

trait ProjectBindings {
  implicit val bindingModule: BindingModule = MyGameConfigurationModule
}

, а затем смешать это с чертой для инъекций:

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

Это техника, которую я использую с такими фреймворками, как калитка, где вы можете 'Мы без труда вмешиваемся в создание новых экземпляров, поэтому я считаю, что это должно работать и в случае использования активности Android.Мне было бы интересно узнать, если это так.Конечно, проблема этого подхода заключается в том, что он не очень гибок в отношении реконфигурирования, поэтому я предпочитаю неявное val в подходе с параметром каррирования, но он работает просто отлично.

Надеюсь, чтопомогает.

Дик

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...