Dagger 2注入构造函数

7 浏览
0 Comments

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文件中的构造函数定义,但是是否有任何缺点?

谢谢。

0