我开始在我正在开发的应用程序中使用Dagger 2,但我对于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();
}
当我调用injectBaseActivity(this)它“告诉”匕首所有@Inject注释是我的类的依赖关系,然后它搜索我的项目ct为@Inject注释的构造函数匹配该类型?
我认为Dagger 2的一个好处就是Module文件可以用作我的依赖关系的“文档”。但是,如果只是在我控制的所有构造函数中添加@Inject,将来会不会有点困惑,因为你不知道什么取决于什么? (我的意思是,你知道什么取决于什么,你只需浏览大量的文件,以真正找出)
有没有什么最佳做法,当在构造函数中使用@Inject注释或何时添加@Provides方法在模块文件? 我在构造函数中使用@Inject我不需要更改我的模块文件中的构造函数定义,但有什么缺点吗?
谢谢。
真棒的答案。你知道是否有可能用注入注释Kotlin默认构造函数(用类定义定义的构造函数)? –
@saiedVanguard这是可能的:'类A @Inject构造函数(...)' –