Dagger 2 - 为什么会出现依赖循环?

43

我正在尝试将应用程序的Context注入到另外两个对象中,一个是AuthManager,另一个是ApiClient

它们都依赖于该上下文,而ApiClient又依赖于AuthManager。如果Context没有引用另外两个对象,为什么这是一种依赖循环?这可以解决吗?

编辑:这里有一些代码

@Module
public class AppModule {

    private final Application application;

    public AppModule(Application application) {
        this.application = application;
    }

    @Provides @Singleton
    Context provideApplicationContext() {
         return this.application;
    }
}


@Module
public class NetworkModule {

    @Provides @Singleton
    public AuthManager providesAuthManager(AuthManager manager) {
        return manager;
    }

    @Provides @Singleton
    public ApiClient providesApiClient(ApiClientFactory factory) {
        return factory.create();
    }
}

@Singleton
@Component(modules = {AppModule.class, NetworkModule.class})
public interface ApplicationComponent {
    void inject(BaseActivity activity);

    // Exported for child-components
    Context context();
    ApiClient apiClient();
    AuthManager authManager();
}
2个回答

86
@Provides @Singleton
public AuthManager providesAuthManager(AuthManager manager) {
    return manager;
}

你的providesAuthManager方法提供了一个AuthManager,其依赖于一个AuthManager

这就形成了循环依赖 :)


在提问时,将任何错误信息添加到问题中会有所帮助。在这种情况下,您错误地解释了错误消息,使我们难以提供帮助 :) - nhaarman
我明白了。看来我误解了咖啡机的例子,因为我认为通过将AuthManager作为本地参数放置,dagger会自动注入它。似乎正确的方法是将Context设置为本地参数。谢谢 :) - Christopher Francisco
1
这个答案促使我再次检查了一个提供的方法,并节省了我数小时的努力,追踪由简单的拼写错误引起的问题。谢谢! - user3265561
我认为你正在寻找的是@Bind。 - Derek Zhu

1

删除 providesAuthManager 方法,并在 AuthManager 构造函数中添加 @Inject


4
这导致了另一个错误:"...不能在未使用@Provide注释的方法的情况下提供"。 - nhoxbypass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接