После успешной реализации Dagger в проекте я должен указать кинжал для каждого класса, который я хочу использовать, и добавить модули, например RestClient
из retrofit
, я хочу знать, есть ли способ автоматически определить components
вклассы?
например моя реализация:
public class CoreApplication extends MultiDexApplication {
private static ProjectApplicationComponent component;
private RestClient restClient;
private Picasso picasso;
private Handler handler;
@Override
public void onCreate() {
super.onCreate();
...
component = DaggerProjectApplicationComponent.builder()
.contextModule(new ContextModule(this))
.networkServiceModule(new NetworkServiceModule(ClientSettings.SERVER_URL))
.build();
restClient= component.apiService();
picasso = component.getPicasso();
handler = component.getHandler();
}
public static ProjectApplicationComponent getComponent() {
return component;
}
}
и мой ApplicationComponent
, который я определяю классом ведьмы или действием или фрагментом, который я хочу внедрить в модули:
@ActivitiesScope
@Component(dependencies = ProjectApplicationComponent.class)
public interface ApplicationComponent {
void inject(PersonsRemoteRepository personsRemoteRepository);
}
и PersonsRemoteRepository
класс, который я хочу внедрить RestClient
, чтобы использовать Retrofit
public class PersonsRemoteRepository implements PersonsRepository {
@Inject
private RestClient restClient;
private final ApplicationComponent component;
public PersonsRemoteRepository() {
component = DaggerApplicationComponent.builder()
.projectApplicationComponent(CoreApplication.getComponent())
.build();
component.inject(this);
}
...
}
мой RestClient
класс:
public interface RestClient {
@Headers("Content-Type: application/json")
@POST("/api/v1/getPersons")
Observable<List<Person>> getPersons();
}
мое значение удаляет component
и component.inject(this);
из всех классов, которые я хочу внедрить RestClient
@Inject
private RestClient restClient;
например, упрощенный PersonsRemoteRepository
класс должен быть:
public class PersonsRemoteRepository implements PersonsRepository {
@Inject
private RestClient restClient;
public PersonsRemoteRepository() {
}
...
}
Заранее спасибо
ОБНОВЛЕНИЕ ПОЧТЫ
в этой моей деятельности inject(this)
недоступно в этой строке кода:
CoreApplication.getComponent().inject(this);
Моя деятельность:
public class LoginActivity extends AppCompatActivity{
@Inject
PersonsRemoteRepository personsRemoteRepository;
@Inject
RestClient restClient;
private LoginActivityBinding mBinding;
private LoginMethodsToPageViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CoreApplication.getComponent().inject(this);
mBinding = DataBindingUtil.setContentView(this, R.layout.login_activity);
personsRemoteRepository = new PersonsRemoteRepository(restClient);
viewModel = new LoginMethodsToPageViewModel(personsRemoteRepository, this, mBinding);
mBinding.setViewModel(viewModel);
}
...
}
на этом снимке экрана, как вы видите, у меня нет inject()
метода
PersonsRemoteRepository
классс после изменения:
public class PersonsRemoteRepository implements PersonsRepository {
private RestClient restClient;
@Inject
PersonsRemoteRepository(RestClient restClient) {
this.restClient = restClient;
}
@SuppressWarnings("unchecked")
@Override
public Observable<List<Person>> getAllPersons() {
Observable<List<Person>> observable = restClient.getPersons();
return observable
.flatMap((Function<List<Person>, Observable<List<Person>>>) Observable::fromArray);
}
}