Как вы вводите impl некоторого интерфейса в Android Activity с помощью Guice - PullRequest
3 голосов
/ 26 ноября 2011

Я использую Guice 3.0 на Android, чтобы сделать DI.

У меня есть

public interface APIClient { }

и

public class DefaultAPIClient implements APIClient { }

Я попытался загрузить Guice в мой класс MyApplication, предоставив ему модуль с одним оператором в конфигурацииmethod bind(APIClient.class).to(DefaultAPIClient.class);

Я сделал то, что мне велел пример Guice

Injector injector = Guice.createInjector(new APIClientModule());
injector.getInstance(APIClient.class);

Возможно, я не правильно понял это, но как бы я внедрил APIClient в несколько действий, которые будутиспользуй это?

Я сделал это в HomeActivity

public class HomeActivity extends RoboActivity {
    @Inject APIClient client;

    protected void onCreate(Bundle savedInstanceState) {
        client.doSomething();
    }
}

Это не работает и дает мне Guice configuration errors: 1) No implementation for com.mycompany.APIClient was bound

Так что единственный способ, которым я смог получитьэто работало, чтобы удалить @Inject из клиента APIClient в HomeActivity и внедрить его с помощью client = Guice.createInjector(new APIClientModule()).getInstance(APIClient.class);

Так значит ли это, что мне придется делать это в каждом действии, которое использует APIClient?Должно быть, я что-то делаю не так.

Любая помощь будет отличной.Спасибо!

Ответы [ 3 ]

4 голосов
/ 27 ноября 2011

Если вы используете Roboguice 2.0 с Guice 3.0_noaop, способ определить дополнительные пользовательские модули - через файл ресурсов строкового массива roboguice_modules:

из документов ( Обновление до 20 ):

Больше нет необходимости / возможности наследовать от RoboApplication, поскольку этот класс пропал. Если вы хотите переопределить привязки RoboGuice по умолчанию, вы можете указать имя класса пользовательского модуля в ресурсе строкового массива под названием «roboguice_modules» в res / values ​​/ roboguice.xml. например.

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <string-array name="roboguice_modules">
        <item>PACKAGE.APIClientModule</item>
    </string-array>
</resources>

Так что вам нужно будет определить ваш пользовательский модуль следующим образом:

roboguice_modules:

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <string-array name="roboguice_modules">
        <item>DONT_KNOW_YOUR_PACKAGE.APIClientModule</item>
    </string-array>
</resources>

со связью между APIClient и DefaultAPIClient по умолчанию.

и Roboguice должен сделать все остальное.

4 голосов
/ 27 ноября 2011

Огромное спасибо Майклу Бертону из Groupon за ответ на этот вопрос в списке рассылки Roboguice . Для всех, кто заинтересован, вот как это сделать программно.

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(this)).with(new MyCustomModule()));
    }
}

Теперь я могу правильно ввести @Inject private APIClient client в Activity.

0 голосов
/ 27 ноября 2011

Вы должны использовать Guice 2.0 (без aop) вместо Guice 3.0

Для правильной настройки Guice необходимо переопределить метод addApplicationModules(List<Module> modules) в своем классе приложения и добавить туда свой модуль.

public class MyApplication extends RoboApplication {
  @Override
  protected void addApplicationModules(List<Module> modules) {
    modules.add(new YourModule());
  }

Для использования инъекций в своей деятельности вам нужно позвонить super.onCreate(savedInstanceState) потому что члены вводятся в onCreate методе RoboActivity.

public class HomeActivity extends RoboActivity {
    @Inject APIClient client;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // Call this before use injected members
        client.doSomething();
    }
}
...