gpt4 book ai didi

java - 为什么 Dagger 注入(inject)不起作用但 component.getObject 可以

转载 作者:行者123 更新时间:2023-12-01 11:05:58 25 4
gpt4 key购买 nike

我正在尝试使用 Dagger 2 实例化 Retrofit 接口(interface)。 CloudContactDataStore 类注入(inject) RestClient 并调用其方法。

当我实例化 CloudContactDataStore 对象时,其 RestClient 属性具有 null 值。

public class CloudContactDataStore implements ContactDataStore {

@Inject RestClient restClient;

public CloudContactDataStore() {
this.initializeInjector();
}

private void initializeInjector() {
ApiComponent component = DaggerApiComponent.builder()
.apiModule(new ApiModule())
.build();

component.inject(this); // Nothing changes, restClient is null!

this.restClient = component.getRestClient(); // This works
}
}

以下是我创建 Dagger 模块和组件的方法:

@Singleton
@Component(modules = ApiModule.class)
public interface ApiComponent {
void inject(ContactDataStore contactDataStore);

RestClient getRestClient();
}

@Module
public class ApiModule {

@Provides public RestClient provideRestClient(ApiService apiService) {
return new RestClientImpl(apiService);
}

@Provides public ApiService provideApiService(RestAdapter restAdapter) {
return restAdapter.create(ApiService.class);
}

@Provides public RestAdapter provideRestAdapter() {
return RestApiAdapter.getInstance();
}
}

那么,为什么inject函数不起作用,但调用componentgetRestClient()却可以呢?

最佳答案

我发现查看 Dagger 2 生成的代码非常有用,因为它非常容易理解,并且通常可以为您指明正确的方向。

Dagger 2 创建的代码与您编写的代码非常相似,因此请考虑如何实现 ApiComponent.inject(ContactDataStore)。假设在该方法中您可以访问 RestClient,您将如何将其放入现场?如果你坐下来写它,你会发现你必须做这样的事情:

((CloudContactDataStore) contactDataStore).restClient = restClient;

或者换句话说,您需要将其转换为特定的实现。 Dagger 2 永远不会向下施放(至少我没见过),因为这通常是不安全的。

所以,你有两个选择。将 inject(ContactDataStore) 方法更改为 inject(CloudContactDataStore),或在 ContactDataStore 上提供允许 RestClient 的方法> 传入。

更新:不可能通过抽象(即接口(interface)、方法)@Inject。

如果您想通过 ContactDataStore API 注入(inject)它,那么您会遇到问题,因为 Dagger 2 目前存在限制(已提出删除它的功能请求),您无法标记摘要方法与@Inject。因此,与此同时(或者永远,如果由于某种原因它无法在 Dagger 2 中工作)您将需要手动执行此操作,即从组件方法获取 RestClient 实例并将其传递给接口(interface)上适当的方法。

关于java - 为什么 Dagger 注入(inject)不起作用但 component.getObject 可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32947791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com