【发布时间】:2015-11-23 20:34:35
【问题描述】:
我正在尝试通过在一个小示例中实现 Dagger 2 来学习 DI。我得到了这个概念 @Module 和 @Component。 @Component 将@Module 与需要注入依赖的类绑定。
Dagger 生成 Dagger,它有一个 Builder 类提供和初始化 依赖关系。
所以我尝试了一些场景以更好地理解 Dagger 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() as Dagger
照顾它。我猜这是微不足道的。
我的问题是 - 这两者有什么区别?我应该使用哪一个?有什么优点 以及每种方法的缺点。另外,如果我想在 Application 不是的类中注入 DatabaseHelper 可访问,我可以用第一选择吗? (因为它提供了一个单例)。
如果我做错了什么并且需要更改其他内容,请指出。这是我的 ApplicationModule 和 ApplicationComponent 类。
@Module
public class ApplicationModule {
private Application mApplication;
public ApplicationModule(Application app) {
mApplication = app;
}
@Singleton
@Provides
Application provideApplication() {
return mApplication;
}
}
应用组件类
@Singleton
@Component(
modules = {
ApplicationModule.class,
DatabaseModule.class
}
)
public interface ApplicationComponent {
Application getApplication();
void inject(MyApplication app);
DatabaseHelper getDBHelper();
}
【问题讨论】:
标签: java android dependency-injection dagger-2