【问题标题】:Dagger 2 - Why is this a dependency cycle?Dagger 2 - 为什么这是一个依赖循环?
【发布时间】:2015-09-23 16:03:28
【问题描述】:

我正在尝试将应用程序的 Context 注入到另外两个对象中,即 AuthManagerApiClient

它们都取决于所述上下文,而ApiClient 取决于AuthManager。如果Context 没有引用其他 2,为什么这是一个依赖循环?可以解决吗?

编辑:这是一些代码

@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();
}

【问题讨论】:

    标签: android dependency-injection dagger dagger-2


    【解决方案1】:
    @Provides @Singleton
    public AuthManager providesAuthManager(AuthManager manager) {
        return manager;
    }
    

    提供AuthManagerprovidesAuthManager 方法依赖于AuthManager

    这是你的周期:)

    【讨论】:

    • 它有助于将您收到的任何错误消息添加到问题中。在这种情况下,您以错误的方式解释了错误消息,使我们更难提供帮助:)
    • 我明白了。似乎我误解了咖啡机的例子,因为我认为通过将 AuthManager 作为本地参数,匕首会自动注入它。似乎正确的方法是将Context 设置为本地参数。谢谢:)
    • 这个答案促使我仔细检查提供的方法,并节省了我数小时的精力来追踪由简单错字引起的问题。谢谢!
    • 我想你要找的是@Bind
    【解决方案2】:

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

    【讨论】:

    • 这会导致其他错误:“...不能在没有@Provide 注释方法的情况下提供”
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2018-09-30
    • 2022-11-10
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多