Система впрыскивания Roboguice - PullRequest
1 голос
/ 20 декабря 2011

Я учусь использовать Roboguice, и у меня возникают проблемы с пониманием того, как внедрить системный сервис.Все примеры, которые я видел, вводят в действие, но я хочу добавить его в POJO.Я использую Roboguice 2.0 beta 3

. У меня есть класс PhoneNumber и я хотел бы внедрить службу TelephonyManager.

public class PhoneNumber {
    @Inject TelephonyManager mTelephonyManager;

    protected Integer getNetworkCountryPrefix() {

        // This gives a null pointer exception 
        mTelephonyManager.getNetworkCountryIso();
    }
}

При внедрении в класс, который расширяет RoboActivity, все работает нормально.Но возможно ли внедрить TelephonyManager в класс, который не расширяет RoboActivity?

Ответы [ 3 ]

9 голосов
/ 20 декабря 2011

Да, есть три основных способа получить инъекцию в ваши объекты при использовании RoboGuice.

  1. Вызовите RoboGuice.injectMembers () для объекта, для которого вы хотите выполнить инъекцию. Для большинства POJO это, вероятно, будет сделано в конструкторе объекта, но также может быть сделано и в другое время. Обратите внимание, что это идеальное решение, но, вероятно, наименее желательный из вариантов, поскольку он жестко кодирует зависимость от вашей структуры DI (RoboGuice).

  2. Введите в класс, который уже делает № 1 для вас. Вы уже знакомы с этим методом ... это именно то, что делает RoboActivity. По сути, большая часть того, что делает RoboActivity, - это просто вызов RoboGuice.injectMembers для вас.

  3. Внедрить TelephonyManager в класс, который был сам внедрен. Обычно это наиболее желательно, хотя в вашем конкретном случае это может быть нежелательно. Позвольте мне объяснить это ниже:

    class MyActivity extends RoboActivity {
        @Inject PhoneNumber phone;
    
        ...
    }
    
    class PhoneNumber {
        @Inject TelephonyManager tm;
    }
    

    По сути, RoboGuice просто нужен шанс выполнить инъекцию в ваш экземпляр. Для обычных POJO, которые не созданы RoboGuice, у RoboGuice нет возможности применить свое волшебство, если вы не вызовете injectMembers напрямую, следовательно, решение № 1. Однако, если вы позволите RoboGuice создать экземпляр объекта для вас, например. внедрив его, RoboGuice контролирует создание объекта и может выполнить инъекцию для вас в этом объекте. Таким образом, в приведенном выше примере, когда RoboGuice создает новый PhoneNumber и помещает его в переменную phone, RoboGuice выполнит внедрение в экземпляр, а tm будет введено правильно. Очевидно, что если вы создадите PhoneNumber с помощью оператора new () вместо того, чтобы RoboGuice это делал, у RoboGuice не будет возможности выполнить внедрение, и tm будет нулевым.

Если у вас работает № 3, я бы пошел на это. Это самый гибкий способ работы, и он поощряет передовые практики, позволяя инфраструктуре DI создавать для вас ваши объекты.

Однако, если PhoneNumber - это не то, что вы обычно позволяете RoboGuice создавать для вас, тогда вы можете рассмотреть возможность использования опции # 1.

1 голос
/ 31 августа 2013

Вы можете использовать в конструкторе это

RoboGuice.getInjector(context).injectMembers(this);

просто нужен контекст

1 голос
/ 04 апреля 2012

TelephonyManager не является одной из стандартных системных служб, доступных для внедрения. Вам нужно будет зарегистрировать этот сервис в своем модуле, прежде чем вы сможете внедрить его в другие области.

http://code.google.com/p/roboguice/wiki/ProvidedInjections

Делая это в своем модуле, вы можете зарегистрировать его для инъекций:

bind(TelephonyManager.class).toProvider(new SystemServiceProvider<TelephonyManager>(Context.TELEPHONY_SERVICE));
...