我最近开始在一个小型Android项目中使用Dagger 2。我不确定我明白应该在哪里建立我的@Component
。
假设我有@Module
提供的依赖关系依赖于Application
。显然,您无法实例化@Module
,因此无法在不引用@Component
的情况下构建Application
。在这种情况下,Application
本身是否有意义构建并保持对@Component
的引用,然后哪些活动和片段可以获取以注入自己?换句话说,而不是:
MyComponent component = DaggerMyComponent.builder()
.myModule(new MyModule((MyApp) getApplication()))
.build();
component.inject(this);
活动只会这样做:
((MyApp) getApplication()).getMyComponent().inject(this);
第二种方式是否有任何缺点?如果模块提供@Singleton
依赖项,那么第二种方式是必要吗?
编辑:我写了一个非Android测试程序。正如我所料,@Component
接口的不同实例产生@Singleton
资源的不同实例。所以看来我的上一个问题的答案是肯定的,除非@Component
本身是一个单身的其他机制。
final AppComponent component1 = DaggerAppComponent.create();
final AppComponent component2 = DaggerAppComponent.create();
System.out.println("same AppComponent: " + component1.equals(component2)); // false
// the Bar producer is annotated @Singleton
System.out.println("same component, same Bar: " + component1.bar().equals(component1.bar())); // true
System.out.println("different component, same Bar: " + component1.bar().equals(component2.bar())); // false
答案 0 :(得分:1)
您的组件必须位于界面中。假设你有一个模块
@Module
public class MainActivityModule {
@Provides
public Gson getGson(){
return new Gson();
}
}
现在您要为此模块创建一个界面,以便在活动中使用它。我将活动注入到这个界面中,但是当你想要用于许多其他活动时这将是棘手的,所以现在我们只想说你想使用MainActivity
@Component(
modules = MainActivityModule.class) //The module you created
public interface IAppModule {
void inject(MainActivity activity);
}
现在您可以在MainActivity中使用,但首先要构建项目,因为Dagger2需要根据您所创建的模块和组件创建自己的类。请注意,在构建项目后,您尚未创建已创建的类DaggerIAppModule
IAppModule appComponent;
@Inject
Gson gson;
public void setupDaggerGraph(){ //call this method in your onCreate()
appComponent = DaggerIAppModule.builder()
.mainActivityModule(new MainActivityModule())
.build();
appComponent.inject(this);
}
答案 1 :(得分:1)
您的建议是正确的。 @Singleton
组件仅保证@Singleton
的一个实例 - 其生命周期范围内的事物,因此您的应用程序必须保留该组件。