У меня есть проект Android, который использует Dagger 2, Livedata и viewmodel, rxjava и привязку данных.
На данный момент я создал AppComponent и два субкомпонента. Appcomponent предназначен для области приложения, а один подкомпонент ControllerComponent предназначен для действий, фрагментов и диалогов. Этот ControllerComponent внедряется в базовую активность и работает нормально.
Другим субкомпонентом является RetrofitComponent, который предназначен для репозиториев viewmodel. Теперь я не могу найти способ внедрить модифицированный компонент в базовый репозиторий, так как это субкомпонент, и у меня нет applicationcontext в классе репозитория.
AppComponent:
@ApplicationScope
@Component(modules = {
ApplicationModule.class,
PrefModule.class
})
public interface AppComponent {
public void inject(AppInstance appInstance);
public AppPreference getAppPref();
public Application getApplication();
public ControllerComponent newControllerComponent(ControllerModule controllerModule);
public RetrofitComponent newRetrofitComponent(RetrofitModule retrofitModule);
}
RetrofitComponent:
@RepositoryScope
@Subcomponent(modules = {RetrofitModule.class})
public interface RetrofitComponent {
public void inject(BaseRepo baseRepo);
public APICall getApiCalls();
}
RetrofitModule:
@Module
public class RetrofitModule {
@Provides
@RepositoryScope
public APICall providePostApi(Retrofit retrofit) {
return retrofit.create(APICall.class);
}
@Provides
@RepositoryScope
public Retrofit provideRetrofitInterface() {
return new RetrofitService().retrofit;
}
}
BaseRepo;
@Inject
public APICall apiCall;
private Disposable subscription;
CompositeDisposable compositeDisposable = new CompositeDisposable();
private RetrofitComponent injector;
public BaseRepo() {
//injector = DaggerRetrofitComponent.builder().retrofitModule(new RetrofitModule()).build();(I tried with dependent component had different problem)
injector = ((AppInstance)getApplication()).getAppComponent().newRetrofitComponent(new RetrofitModule());(Not able to use getApplication())
injector.inject(this);
}
Я собираюсь использовать дочерние репозитории, расширяющие этот базовый репозиторийиз их соответствующих моделей просмотра, поэтому я не собираюсь передавать приложение из действий или фрагментов.
Чего мне не хватает? Или делаешь неправильно? Или мой подход неправильный?
И еще одна вещь, как только это будет сделано, я должен внедрить классы репозитория в классе Viewmodel или я должен создать фабричный класс и вызвать тот репозиторий, который мне нужен, что является лучшей практикой?