Корректная реализация Dagger2 с модернизацией и обратными вызовами

Я работаю над рефакторингом проекта и хочу начать с внедрения зависимостей и заставить Даггер работать на протяжении всего проекта. Ниже приведен пример того, что я уже сделал, и он работает, но я хочу посмотреть, правильно ли он реализован, и есть ли способ иметь дополнительные поля в BindsInstance для компонента.

Мой пример здесь идет по пути:

Фрагмент -> ServiceUtil -> Сервис

Мой фрагмент создает экземпляр класса ServiceUtil и устанавливает одно из свойств обратного вызова для функции, которая существует во фрагменте. Мой класс ServiceUtil затем использует Retrofit и экземпляр моего интерфейса Service для вызова API и возврата обратного вызова.

Вопросы:

  1. Имеет ли смысл то, как я это изложил ниже, и правильно ли это архитектурно?
  2. Должен ли я создать два компонента: один между фрагментом и ServiceImpl, а другой - между ServiceImpl и службой?
  3. У меня есть несколько классов 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();
    }
}

0 ответов

Другие вопросы по тегам