2014-11-03 6 views
0

У меня есть Dagger объектный граф, который может создавать экземпляры MyClass неявно, поскольку конструктор MyClass аннотируется @Inject.Синглтон только в графике с плюсовым кинжалом

У меня также есть модуль, который I plus на моем существующем графике. Моя цель - для плюсового графика и только для плюсового графика, чтобы обрабатывать MyClass в качестве одноэлементного и всегда возвращать один и тот же экземпляр.

Как я могу лучше всего добиться того, чтобы с минимальным шаблонного кода, то есть без

а) Построив экземпляры себя в plus'ed-модуль, написав метод @Provides @Singleton, объявляя все зависимости от MyClass:

@Module public class Submodule { 
    @Provides @Singleton MyClass provideMyClass(DepA depA, DepB depB) { 
    return new MyClass(depA, depB); 
    } 
} 

б) Извлечение интерфейс из MyClass и снова писать методы Провайдер:

@Module public class Submodule { 
    @Provides @Singleton IMyClass provideMyClass(MyClassImpl myClass) { 
    return myClass; 
    } 
} 

Мой конкретный вариант использования - это приложение для Android, где экземпляр Activity зависит от ведущего, который также должен быть введен в фрагменты активности. Поскольку существует несколько экземпляров одного и того же Activity, я не могу объявить MyClass синглтон глобально.

Я думаю, в конце концов, вопрос сводится к тому, как можно написать что-то вроде этого, без цикла зависимостей:

@Provides @Singleton public MyClass provideMyClass(MyClass m) { return m; } 

ответ

2

Я не думаю, что это возможно. Вы должны указать аннотацию @Singletonгде-то.
Юридические места для этого находятся непосредственно над декларацией класса или в методе, аннотированном @Provides.

С учетом этих двух ограничений вы уже предложили все возможные решения: Объявление класса не полезно, поскольку оно должно быть только одноэлементным в плюсовом графике, а методы @Provides могут быть реализованы только как вы сделал.


Единственное, что я могу думать о том, что могло бы быть в состоянии сделать это, чтобы поставить свой оригинальный ObjectGraph в ваших Submodule «конструктору, и использовать ObjectGraph.get(MyClass.class) вернуться в методе provideMyClass. Разумеется, конечно, любые переопределенные зависимости в вашем подмодуле не используются при создании экземпляра MyClass.

Я думаю, что этот метод создает слишком много накладных расходов и вводит возможные (будущие) ошибки в сравнении с вашими предложенными методами.

+0

Да, подумал. Имеет смысл, спасибо! –

+0

Еще одна идея, что у меня было, что я отскакиваю от вас, так как вы написали единственный ответ :) Я сейчас размышляю, было бы ужасно или красиво, чтобы плюсы на самом модуле объявляли некоторые зависимости (например, ведущий) и пусть материнская графа создает экземпляр или вводит этот модуль? –

+0

Вероятно, это тоже немного для Франкенштейна для читаемой кодовой базы ... –

Смежные вопросы