Dagger 2注入构造函数
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类中我有如下代码:
public class AuthController { private Context context; @Inject public AuthController(Context context) { this.context = context; } public void auth() { // 使用上下文进行操作 } }
我在我的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(); } }
现在我的问题是,Dagger如何知道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)时,它“告诉”dagger所有@Inject注解都是我的类的依赖项,然后它在我的项目中搜索与该类型匹配的@Inject注解构造函数?
我认为Dagger 2的一个好处是Module文件可以用作我的依赖树的“文档”。但是如果我只是在所有我可以控制的构造函数中添加@Inject,难道它在将来不会变得有些混乱吗?因为你不知道实际上什么依赖于什么?(我的意思是,你知道什么依赖于什么,但是你必须浏览很多文件才能真正找出来)
在使用@Inject注解构造函数或在Module文件中添加@Provides方法时,是否有任何最佳实践?
我知道在构造函数中使用@Inject就不需要改变我的Module文件中的构造函数定义,但是是否有任何缺点?
谢谢。