Guice в Android без использования Roboguice, хороший выбор?

Я использую Roboguice некоторое время, но, поскольку я вижу исходный код на github, в нем много ненужного, что я обычно не использую или не нуждаюсь в нем, поэтому я решил начать работать только с Guice. Единственным недостатком этого является то, что мне нужно внедрить контекст Android и настроить его самостоятельно, поэтому я делаю это:

public class AndroidDemoApplication extends Application {

    private static AndroidDemoApplication instance;
    private static final Injector INJECTOR = Guice.createInjector(new AndroidDemoModule());

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static Context getAppContext() {
        return instance;
    }

    public static void injectMembers(final Object object) {
        INJECTOR.injectMembers(object);
   }

}

А затем в моем классе, который расширяет AbstractModule:

    public class AndroidDemoModule extends AbstractModule {

    @Override
    protected void configure() {

        bind(Context.class).toProvider(new Provider<Context>() {
            @Override
            public Context get() {
                return AndroidDemoApplication.getAppContext();
            }
        });
//        .in(Singleton.class);
    }
}

Это хороший подход? На данный момент мне нужен только контекст для использования, скажем, в диспетчере сеансов, которому нужен контекст для создания экземпляра sharedPreference и игры с ним.

Наконец: это хороший подход к замене Roboguice на Guice, когда я хочу вводить только свои объекты, а не что-либо, связанное с Android, только контекст? И используйте что-то более легкое и менее зависимое, чем Roboguice. В конце концов, Dagger делает что-то подобное, верно?


person Nicolas Jafelle    schedule 27.11.2014    source источник


Ответы (1)


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

Это не имеет смысла: используйте ProGuard, чтобы избавиться от классов, которые вы не используете (и минимизируйте ресурсы с помощью Gradle 0.14).

Существует причина разработки RoboGuice: Guice был написан с учетом настольных компьютеров. Он довольно сильно использует отражение. Это не проблема на рабочем столе, но на мобильных устройствах отражение работает довольно плохо.

Вы должны либо придерживаться RoboGuice, либо, возможно, рассмотреть Dagger 2. Сейчас он довольно близок к выпуску и был написан ребятами из Guice как современная и быстрая (никаких размышлений вообще, волшебство происходит во время компиляции) библиотека для внедрения зависимостей. для Android.

person Teovald    schedule 27.11.2014
comment
Спасибо!! Я посмотрю на Кинжал 2. - person Nicolas Jafelle; 28.11.2014
comment
@NicolasJafelle, просто для ясности: вот презентация Dagger 2: youtube.com/watch?v =oK_XtfXPkqw . А репозиторий находится здесь github.com/google/dagger, а не в Square/Dagger. - person Teovald; 28.11.2014
comment
Кинжал - это то же самое, что и Гайс? Я имею в виду ... это вообще не связано с Android Framework, и вам нужно настроить контекст и все такое, верно? Итак... Если вы рекомендуете использовать Roboguice для Android-приложений, почему вы рекомендуете лучше выбрать Dagger 2? Это просто для любопытства. Спасибо! - person Nicolas Jafelle; 30.11.2014
comment
Чтобы немного схематизировать: Guice был первой попыткой внедрения зависимостей. Я не слишком хорошо знаком с RoboGuice, но он выглядит довольно близко к Guice с добавлением некоторых вспомогательных методов Android, таких как внедрение представлений (концепция может выглядеть похожей, но она сильно отличается от DI). Ограничение Guice для Android заключается в том, что он был написан для огромных ферм серверов и плохо масштабируется для Android. В частности, Android не очень хорош с отражением, и Guice часто его использует. - person Teovald; 01.12.2014
comment
В результате вы получаете более медленное приложение и более длительное время запуска приложения. Так появился Dagger (если мне не изменяет память, от бывших гуглеров из Square, которые работали над Guice). Та же цель, внедрение зависимостей, но на этот раз с гораздо большим количеством вещей, сгенерированных во время компиляции, поэтому гораздо меньше размышлений. - person Teovald; 01.12.2014
comment
Наконец, Dagger возвращается в Google с Dagger 2. Команда Java Core в Google в значительной степени переписала Dagger, чтобы 1) полностью исключить отражение 2) сделать сгенерированный код читабельным (чтобы его было легче отлаживать). - person Teovald; 01.12.2014
comment
Спасибо @теовальд !! Я читаю о Dagger 2 и кажется довольно классным! - person Nicolas Jafelle; 01.12.2014