2016-04-12 5 views
1

с кинжалом 2 У меня есть модуль, который вызывает веб-сервис. Мне нужно иметь возможность называть его разными параметрами каждый раз (в основном переключение в бэкэнд, так что только True или False будут меняться). Я не вижу, как передать эти параметры в модуль Dagger 2, кроме как в конструкторе, или с чем-то, введенным как часть инструкции @Provides. Я очень хорошо знаком с DI, так как каждый день занимаюсь Spring, но я не вижу этого аспекта с помощью Dagger 2. В некотором смысле я хочу создать эквивалент Spring @Service или @Component с методами, которые я могу вызвать с помощью соответствующие параметры для прохождения. Что мне не хватает с кинжалом 2?Компонент многоразового использования Dagger 2

Является ли модулем даже правильный объект, который я хочу создать?

ОБНОВЛЕНИЕ: добавлен пример кода.

Модуль:

@Module 
public class RecordedProgramWatchedStatusModule { 

    private int chanId = -1; 
    private DateTime startTime = null; 
    private boolean watched; 

    public RecordedProgramWatchedStatusModule() { } 

    public RecordedProgramWatchedStatusModule(int chanId, DateTime startTime, boolean watched) { 
     this.chanId = chanId; 
     this.startTime = startTime; 
     this.watched = watched; 
    } 

    @Provides 
    @PerActivity 
    @Named("updateRecordedProgramWatchedStatus") 
    UseCase provideGetUserDetailsUseCase(DvrRepository dvrRepository, ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) { 
     return new PostUpdatedRecordedWatchedStatus(chanId, startTime, watched, dvrRepository, threadExecutor, postExecutionThread); 
    } 

} 

Observable:

public class PostUpdatedRecordedWatchedStatus extends UseCase { 

    private final int chanId; 
    private final DateTime startTime; 
    private final boolean watched; 
    private final DvrRepository dvrRepository; 

    public PostUpdatedRecordedWatchedStatus(final int chanId, final DateTime startTime, final boolean watched, final DvrRepository dvrRepository, ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) { 
     super(threadExecutor, postExecutionThread); 
     this.chanId = chanId; 
     this.startTime = startTime; 
     this.watched = watched; 
     this.dvrRepository = dvrRepository; 
    } 

    @Override 
    protected Observable buildUseCaseObservable() { 
     return this.dvrRepository.updateRecordingWatchedStatus(this.chanId, this.startTime, watched); 
    } 
} 

Backend Handler:

@SuppressWarnings("Convert2MethodRef") 
@Override 
public Observable<Boolean> updateRecordingWatchedStatus(final int chanId, final DateTime startTime, final boolean watched) { 
    Log.d(TAG, "updateRecordingWatchedStatus : enter"); 
    final DvrDataStore dvrDataStore = this.dvrDataStoreFactory.createMasterBackendDataStore(); 

    return dvrDataStore.updateRecordingWatchedStatus(chanId, startTime, watched) 
      .doOnError(throwable -> Log.e(TAG, "updateRecordingWatchedStatus : error", throwable)) 
      .doOnCompleted(() -> dvrDataStore.recordedProgramEntityList(true, -1, -1, null, null, null)); 
} 
+0

Используете ли вы только Dagger2 в своем проекте? Я обычно делегировал вызовы Rest и WS для RxJava, поэтому я создаю динамический Observable, который получает параметры и переходит к части кинжала со значением, которое мне нужно. – Leonardo

+0

@ LeonardoFerrari Да, я использую Dagger 2 и RxJava, а также в своем проекте. Архитектура чиста, поэтому весь доступ к данным находится в подпроекте, который вводится обратно в приложение с помощью Dagger 2. Но я просто не вижу, как создать что-то эквивалентное Spring Service, где я могу звонить на него, когда необходимо, не полагаясь на конструктор для ввода этих параметров в модуль. Кажется, это единственные примеры, которые я нахожу. Возможно, то, что я ищу, не является подходящим использованием Dagger2. – dmfrey

+0

Хм, я вижу, попробуйте отправить какой-то код, пожалуйста, я посмотрю, что мы можем сделать! – Leonardo

ответ

0

Так я понимаю, что происходит. В этом случае я реализовал нечто, называемое DynamicUseCase, где вы можете передавать параметры в свою UseCase и внутри репозитория, который вы их извлекаете. Check you my project

Взгляните: https://github.com/leonardo2204/Flow1.0.0-alphaExample/blob/master/app/src/main/java/leonardo2204/com/br/flowtests/domain/interactor/DynamicUseCase.java

https://github.com/leonardo2204/Flow1.0.0-alphaExample/blob/master/app/src/main/java/leonardo2204/com/br/flowtests/domain/interactor/GetContacts.java

https://github.com/leonardo2204/Flow1.0.0-alphaExample/blob/master/app/src/main/java/leonardo2204/com/br/flowtests/presenter/FirstScreenPresenter.java#L86-L89

Вы просто унаследовать от DynamicUseCase, передать переменные в Bundle и передать его в качестве параметра расслоения USECASE, например:

public class GetContacts extends DynamicUseCase { 

    private final ContactsRepository contactsRepository; 

    @Inject 
    public GetContacts(ContactsRepository contactsRepository, ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) { 
     super(threadExecutor, postExecutionThread); 
     this.contactsRepository = contactsRepository; 
    } 

    @Override 
    public Observable buildUseCaseObservable(Bundle bundle) { 
     return this.contactsRepository.getContactsFromPhone(bundle.getBoolean("mustHaveNumber", false)); 
    } 
} 

Bundle bundle = new Bundle(1); 
bundle.putBoolean("mustHaveNumber", musthavenumber); 
this.getContacts.execute(new GetContactsSubscriber(), bundle); 

Это Вот что! Надеюсь, что это поможет!

+0

Это отлично работает! Мое единственное изменение состояло в том, чтобы заменить Bundle на карту, так как мой доменный слой - это чистая java без зависимостей от Android. – dmfrey

+0

Несомненно, результат тот же! Преимущество Bundle заключается в том, что он легче. Рад, что это сработало! – Leonardo

+0

Точно, я хочу сохранить эту чистую java. Я уверен, что есть некоторые более легкие варианты веса, которые я мог бы использовать, но карта достаточно. – dmfrey