我想通过在一个小例子中实现它来学习DI与Dagger 2。我得到了 @Module和@Component的概念。 @Component将@Module绑定到需要注入依赖项的类。空构造函数模块和提供依赖于Dagger 2中参数的模块有什么区别?
Dagger生成Dagger,它有一个Builder类,它提供并初始化 依赖项。
所以我试了一些场景,以更好地理解匕首2.我有一些问题,但我会去 与一个现在。
我需要注入DatabaseHelper类。我为此创建了DatabaseModule类。我也发现 我可以跳过这个类,并在我的主要ApplicationModule中添加一个方法来提供DatabaseHelper。要做 我不能将DatabaseModule添加到ApplicationComponent模块列表中。无论如何,我已将DatabaseModule 保存在ApplicationComponent模块列表中,并从ApplicationModule中删除该方法。回到我的问题。
我有两个选择,当涉及到创建DatabaseModule类。这是第一个。
@Module
public class DatabaseModule {
private Application app;
public DatabaseModule(Application app) {
this.app = app;
}
@Singleton
@Provides
public DatabaseHelper provideDBHelper() {
return new DatabaseHelper(app.getApplicationContext());
}
}
而第二个选项是,
@Module
public class DatabaseModule {
@Singleton
@Provides
public DatabaseHelper provideDBHelper(Application app) {
return new DatabaseHelper(app.getApplicationContext());
}
}
如果我使用第二种方法,我不需要调用组件生成器的方法.databaseModule()
如匕首 照顾它。我想这个数字非常微不足道。
我的问题是 - 这两者有什么区别?我应该使用哪一个?什么是专业 和每种方法的缺点。另外,如果我想在Application不是 的类中注入DatabaseHelper,我可以使用第一个选项吗? (因为它提供了一个单身人士)。
请指出,如果我做错了什么,需要改变的东西。这是我的 ApplicationModule和ApplicationComponent类。
@Module
public class ApplicationModule {
private Application mApplication;
public ApplicationModule(Application app) {
mApplication = app;
}
@Singleton
@Provides
Application provideApplication() {
return mApplication;
}
}
ApplicationComponent类
@Singleton
@Component(
modules = {
ApplicationModule.class,
DatabaseModule.class
}
)
public interface ApplicationComponent {
Application getApplication();
void inject(MyApplication app);
DatabaseHelper getDBHelper();
}