注入类如何获得对进样器的引用?

时间:2015-12-08 20:54:34

标签: android dagger-2

我最近开始在一个小型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

2 个答案:

答案 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的一个实例 - 其生命周期范围内的事物,因此您的应用程序必须保留该组件。