Я начинаю использовать Dagger 2 в приложении, которое я разрабатываю, но у меня есть некоторые вопросы о том, как работает Dagger 2.
Я получаю всю логику методов @Provides и аннотацию @Inject для инициализации ваших зависимостей, но аннотация @Inject для конструкторов классов - вот некоторые ошибки.
Например:
Мне мое приложение, у меня есть один модуль, определенный ContextModule, для извлечения контекста моего приложения:
ContextModule.java
@Module
public class ContextModule {
private final Context context;
public ContextModule(Context context) {
this.context = context;
}
@Provides
public Context context() {
return this.context;
}
}
Этот модуль используется моим BaseActivityComponent:
BaseActivityComponent.java
@BaseActivityScope
@Component(modules = ContextModule.class)
public interface BaseActivityComponent {
void injectBaseActivity(BaseActivity baseActivity);
}
До сих пор так хорошо.. тогда у меня есть класс AuthController, который зависит от контекста, и я хочу вставить его в свой BaseActivity. Итак, в моем AuthControllers.class у меня есть что-то вроде:
public class AuthController {
private Context context;
@Inject
public AuthController(Context context) {
this.context = context;
}
public void auth() {
// DO STUFF WITH CONTEXT
}
}
И я добавляю его в свой BaseActivity, например:
public class BaseActivity extends AppCompatActivity {
@Inject
AuthController authController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BaseActivityComponent component = DaggerBaseActivityComponent.builder()
.contextModule(new ContextModule(this))
.build();
component.injectBaseActivity(this);
authController.auth();
}
}
Теперь мой вопрос: как кинжал знает, что мои AuthControllers являются зависимыми для BaseActivity? Просто объявив
@Inject
AuthController authController;
он похож на то же, что если бы я создал ControllerModule, например:
@Module(includes = ContextModule.class)
public class ControllerModule {
@Provides
AuthController authController(Context context) {
return new AuthController(context);
}
}
И затем в моем BaseActivityComponent я бы добавил мой AuthController getter и изменил свой модуль зависимостей на ControllersModule:
@BaseActivityScope
@Component(modules = ControllersModule.class)
public interface BaseActivityComponent {
void injectBaseActivity(BaseActivity baseActivity);
AuthController getAuthController();
}
Когда я вызываю injectionBaseActivity (это), он "сообщает" кинжалу, что все аннотации @Inject являются зависимостями моего класса, а затем он ищет мой проект для аннотированных конструкторов @Inject, которые соответствуют этому типу?
Я подумал, что хорошая вещь о Dagger 2 заключается в том, что файлы модуля могут использоваться как "документация" моих зависимостей три. Но если просто добавить @Inject во все конструкторы, которыми я управляю, не мог бы он немного запутать в будущем, так как вы не знаете, что на самом деле зависит от чего? (Я имею в виду, вы знаете, что зависит от того, что вам нужно просто просмотреть много файлов, чтобы действительно узнать)
Есть ли какие-либо рекомендации по использованию @Inject-аннотаций в конструкторах или когда добавлять метод @Provides в файлы модулей? Я получаю это, используя @Inject в конструкторе. Мне не нужно изменять определение конструктора в моем файле модуля, но есть ли недостаток?
Спасибо.