java为什么匕首注入不起作用,而是组件。getObject是
我试图使用Dagger2来实例化一个改型接口。CloudContactDataStore
类注入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
函数不起作用,而调用component
的getRestClient()
是吗
# 1 楼答案
我发现查看Dagger 2生成的代码非常有用,因为它非常容易理解,并且通常可以为您指出正确的方向
Dagger2创建的代码与您编写的代码非常相似,因此请考虑如何实现
ApiComponent.inject(ContactDataStore)
。假设在该方法中,您可以访问RestClient,您将如何将其引入该字段?如果你坐下来写,你会注意到你必须这样做:或者换句话说,您需要将其分解为特定的实现。匕首2从来没有放下过(至少我没见过),因为那通常是不安全的
所以,你有两个选择。将
inject(ContactDataStore)
方法更改为inject(CloudContactDataStore)
,或者在ContactDataStore
上提供一个允许传入RestClient
的方法更新:不可能通过抽象@Inject,即接口、方法
如果您想通过
ContactDataStore
API注入它,那么您有一个问题,因为Dagger 2中当前有一个限制(已提出删除它的功能请求),即您不能用@Inject
标记抽象方法。因此,在此期间(或者永远,如果有某种原因它无法在Dagger 2中工作),您将需要手动执行此操作,即从组件方法获取RestClient
的实例,并将其传递给接口上的适当方法