匕首 2 注入构造函数
我开始在我正在开发的应用程序中使用Dagger 2,但我对Dagger 2的工作原理有一些疑问。
我了解了@Provides方法背后的所有逻辑,以及用于初始化依赖项的@Inject注释,但是对类构造函数的@Inject注释有点让我感到困扰。
例如:
我的应用程序,我定义了一个模块,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使用:
基本活动组件.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;
这就像我创建了一个控制器模块一样:
@Module(includes = ContextModule.class)
public class ControllerModule {
@Provides
AuthController authController(Context context) {
return new AuthController(context);
}
}
然后在我的BaseActivityComponent中,我会添加我的AuthController getter并将我的依赖模块更改为ConsordersModule:
@BaseActivityScope
@Component(modules = ControllersModule.class)
public interface BaseActivityComponent {
void injectBaseActivity(BaseActivity baseActivity);
AuthController getAuthController();
}
当我调用 injectBaseActivity(this) 时,它会“告诉”dagger,所有@Inject注释都是我的类的依赖项,然后它会搜索我的项目,以查找与该类型匹配@Inject注释构造函数?
我认为Dagger 2的一个好处是模块文件可以用作我的依赖项三的“文档”。但是,如果只是在我控制的所有构造函数中添加@Inject,那么将来会不会有点混乱,因为你不知道什么实际上取决于什么?(我的意思是,你知道什么取决于什么,你只需要浏览很多文件才能真正找出答案)
在构造函数中使用@Inject注释或何时在模块文件中添加@Provides方法时,是否有任何最佳实践?我在构造函数中使用@Inject,我不需要更改模块文件中的构造函数定义,但是有什么缺点吗?
谢谢。