Корректная реализация Dagger2 с модернизацией и обратными вызовами
Я работаю над рефакторингом проекта и хочу начать с внедрения зависимостей и заставить Даггер работать на протяжении всего проекта. Ниже приведен пример того, что я уже сделал, и он работает, но я хочу посмотреть, правильно ли он реализован, и есть ли способ иметь дополнительные поля в BindsInstance для компонента.
Мой пример здесь идет по пути:
Фрагмент -> ServiceUtil -> Сервис
Мой фрагмент создает экземпляр класса ServiceUtil и устанавливает одно из свойств обратного вызова для функции, которая существует во фрагменте. Мой класс ServiceUtil затем использует Retrofit и экземпляр моего интерфейса Service для вызова API и возврата обратного вызова.
Вопросы:
- Имеет ли смысл то, как я это изложил ниже, и правильно ли это архитектурно?
- Должен ли я создать два компонента: один между фрагментом и ServiceImpl, а другой - между ServiceImpl и службой?
- У меня есть несколько классов ServiceImpl с несколькими обратными вызовами, потому что этот ServiceImpl обрабатывает несколько определенных служб в классе обслуживания. Например, у меня есть служба для ForgotPassword, которая требует 3 API. Итак, у меня есть 3 API, определенные в интерфейсе ForgotPasswordService, и, следовательно, три обратных вызова в его классе реализации. Могу ли я сделать так, чтобы обратные вызовы были необязательными в моем компоненте? Некоторые экраны могут использовать только 1 из 3 вызовов API.
Фрагмент:
public class Fragment1 extends BaseFragment
{
@Inject
ForgotPasswordServiceImpl forgotPasswordServiceImpl;
public static Fragment1 newInstance()
{
return new Fragment1();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment1, container, false);
ComponentA daggerComponentA = DaggerComponentA.builder().apiCallback(apiCallback).baseUrl(Urls.basePreauthUrl).build();
daggerComponentA.inject(this);
}
private Callback<String> apiCallback = new CustomCallback<String>()
{
@Override
public void onResponseReceived(Call<String> call, Response<String> response)
{
int statusCode = response.code();
if (statusCode == HttpCodes.OK && response.body() != null && response.body().getStatus().equals(SUCCESS_INDICATOR) && !response.body().getParticipantID().isEmpty())
{
//Update some stuff
}else{
//Update some stuff
}
}
@Override
public void onSessionExpired(Call<String> call, Response<String> response)
{
//Do something different
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t)
{
//Do Something
}
};
}
ServiceImpl Class
public class MyServiceImpl
{
MyServiceImpl myService;
Callback<String> apiCallback;
public MyServiceImpl(MyServiceImpl myService, Callback<String> apiCallback){
this.myService = myService;
this.apiCallback = apiCallback;
}
public void callApi(String test){
Call<String> api = myService.findUser();
api.enqueue(apiCallback);
}
}
Класс обслуживания
public interface MyService
{
@POST(Urls.exampleUrl)
Call<String> findUser();
}
Класс компонента
@Component(modules = {TestModule.class})
public interface TestComponent
{
@Component.Builder
interface Builder {
@BindsInstance Builder baseUrl(@Named("baseUrl") String baseUrl);
@BindsInstance Builder apiCallback(@Named("apiCallback") Callback<String> apiCallback);
ForgotPasswordComponent build();
}
void inject(Fragment1 fragment1);
}
Класс TestModule
@Module
public class TestModule extends PreAuthBaseModule
{
@Provides
public MyService myService(Retrofit retrofit){
return retrofit.create(MyService.class);
}
@Provides
public Callback<String> apiCallback(@Named("apiCallback") Callback<String> apiCallback){
return apiCallback;
}
@Provides
public MyServiceImpl myServiceImpl(MyService myService, Callback<String> apiCallback){
return new MyServiceImpl(myService, apiCallback);
}
}
PreAuthBaseModule Class
@Module(includes = {PreAuthOkHttpClientModule.class, JacksonConverterFactoryModule.class})
public class PreAuthBaseModule
{
@Provides
public Retrofit retrofit(@Named("baseUrl") String baseUrl, OkHttpClient okHttpClient, JacksonConverterFactory factory){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(factory)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
}
}