Dagger2如何让注入对象知道是谁创建的

时间:2018-01-29 23:12:41

标签: java android dagger-2

例如我有:

Public Class A extends Parent{
    @Inject B b;

    public A(){
     DaggerAppComponent.create().inject(this); //inject b here
    }

    public void doStuff(){
        b.start();
    }

    @Override
    public void onDone(){
       Log.v(TAG, "done");
    }
}

和B组:

Public Class B{
    private Parent parent;

    Public B(Parent parent){
        this.parent = parent;
    }

    public void start(){
       parent.onDone();
    }
}

我的问题是如何将A类实例传递给B类?在匕首AppModule中,我为A类和B类提供了方法:

@Module
Public AppModule{

    @Provide
    @Singleton
    A provideA(){
        return new A();
    }

    @Provide
    B provideB(A a){
        return new B(A a);
    }

}

使用此代码,我得到循环依赖,导致堆栈溢出错误。当创建A时,A尝试注入B,并且当provide方法创建B ...

时创建新的A.

正确的注射方法是什么?或者我应该在这种情况下避免注射?

新想法: 也许我可以在dagger模块中保存创建的对象(a和b),并且当调用provide方法时,返回已保存的实例而不是创建新实例。这应该与使用@Singleton相同,但在我看来,在调用provide方法时仍然会调用构造函数。(当调用A的构造函数时,它会产生堆栈溢出问题。)而且我'我还担心在匕首模块中保存变量是一种不好的做法。

1 个答案:

答案 0 :(得分:0)

发现这个"依赖注入的核心原则:一个类不应该知道如何注入它。"在https://google.github.io/dagger/android.html

除非有人上前告诉我,我错了,否则我会假设注入的对象不应该知道它的父母。