Инъекция кинжала не работает для модификации

Я пытаюсь использовать Dagger 2 для создания интерфейса Retrofit. Класс CloudContactDataStore внедряет RestClient и вызывает его методы.

Когда я создаю экземпляр объекта CloudContactDataStore, его атрибут RestClient имеет значение null.

public class CloudContactDataStore implements ContactDataStore {

    @Inject RestClient restClient;

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

    private void initializeInjector() {
        DaggerApiComponent.builder()
                .apiModule(new ApiModule())
                .build()
                .inject(this);
    }

    @Override
    public Observable<ContactEntity> contactLogin(String contactId) {
        return this.restClient.contactLogin(contactId); // Here restClient is null!
    }
}

Вот как я создаю модуль и компонент Dagger:

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

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

Теперь класс RestClient и его реализация:

public interface RestClient {
    Observable<ContactEntity> contactLogin(String contactId);
}

public class RestClientImpl implements RestClient {

    ApiService apiService;

    @Inject
    public RestClientImpl(ApiService apiService) {
        this.apiService = apiService;
    }

    @Override
    public Observable<ContactEntity> contactLogin(String contactId) {
        return apiService.login(contactId, "xxx-xxx-xxx");
    }
}

Интерфейс ApiService — это интерфейс модернизации:

public interface ApiService {

    String API_BASE_URL = "http://192.168.1.2";

    @POST("/login")
    Observable<ContactEntity> login(@Body String id, @Header("Key") String key);

}

И, наконец, RestApiAdapter:

public class RestApiAdapter {

    private static RestAdapter sharedInstance = null;

    public static RestAdapter getInstance() {
        if (sharedInstance == null){


            sharedInstance = new RestAdapter.Builder()
                    .setLogLevel(RestAdapter.LogLevel.FULL)
                    .setEndpoint(ApiService.API_BASE_URL)
                    .build();
        }

        return sharedInstance;
    }
}

Может ли кто-нибудь увидеть, что я делаю неправильно?

Спасибо!


person marc_aragones    schedule 02.10.2015    source источник
comment
Как вы получили доступ к своему компоненту кинжала в действии или фрагменте?   -  person subhash    schedule 02.10.2015
comment
Activity вызывает метод объекта. Этот объект создает экземпляр CloudContactDataStore и вызывает метод contactLogin.   -  person marc_aragones    schedule 02.10.2015


Ответы (1)


Это та же проблема, что и в Почему Инъекция кинжала не работает, но component.getObject yes и то же решение. То есть вам нужно либо изменить свой метод inject(ContactDataStore) на inject(CloudContactDataStore), чтобы он мог видеть поле, которое необходимо внедрить, либо вам нужно добавить метод в ContactDataStore, который позволит вам внедрить метод самостоятельно.

person Paul Duffin    schedule 08.10.2015