Код Dagger работает, как заставить этот код Toothpick работать так же? - PullRequest
0 голосов
/ 24 июня 2018

Я начинаю использовать Toothpick, и мне нужно перейти с кода Dagger на Toothpick.

Ну, у меня есть следующая строка в моем проекте с Dagger.

@Provides
    @Singleton
    @Named(ProjectsRepository.DB)
    ProjectsRepository provideProjectsDBRepository(ProjectsDBRepository repository) {
        return repository;
    }

и

@Provides
    @Singleton
    ProjectsService provideProjectsService(ProjectsServiceImpl serviceImplementation) {
        return serviceImplementation;
    }

и

@Inject
@Named(ProjectsRepository.SERVER)
ProjectsRepository mServerRepository;

@Inject
@Named(ProjectsRepository.DB)
ProjectsRepository mDBRepository;

@Inject
public ProjectsServiceImpl() {

}

Работает нормально (помимо того, что я до сих пор не могу понять, что или кто поставил репозиторий / сервис-имплементацию для предоставления-методов). Ну, я пытаюсь сделать то же самое в Зубочистке и сделать следующее:

public RepositoryModule() {
bind(ProjectsRepository.class).withName(ProjectsServer.class).toInstance(new ProjectsServerRepository());
    }

тогда

public ServiceModule() {
        bind(ProjectsService.class).toInstance(new ProjectsServiceImpl());
    }

и наконец

@Inject
@ProjectsServer
ProjectsRepository mServerRepository;

@Inject
@ProjectsDatabase
ProjectsRepository mDBRepository;

@Inject
public ProjectsServiceImpl() {

}

и у меня есть все квалификаторы выше.

Я устанавливаю свои модули в классе Fragment (Fragment Scope) следующим образом

Scope currentScope = Toothpick.openScopes(ApplicationInstance.class,ProjectsFragment.class);
    currentScope.installModules(
    new ServiceModule(),
    new RepositoryModule());
    Toothpick.inject(this, currentScope);

Но в итоге я получаю NullPointerException, что мой ProjectsRepository имеет значение null, и я не могу использовать метод его экземпляра.

Где я делаю ошибки? Пожалуйста, помогите "перевести".

1 Ответ

0 голосов
/ 25 июня 2018

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

Поставщики могут использоваться следующим образом (показывать только для репозитория сервера)

Первый, ServiceModule

public ServiceModule() {
   bind(ProjectsService.class).toProvider(ProjectsServiceImplProvider.class);
}

Второй, RepositoryModule

public RepositoryModule() {
    bind(ProjectsRepository.class).withName(ProjectsServer.class).toProvider(ProjectsServerRepositoryProvider.class);
}

В-третьих, ServiceImplProvider

public class ProjectsServiceImplProvider implements Provider<ProjectsServiceImpl> {

@Inject
@ProjectsServer
ProjectsRepository mServerRepository;

@Inject
@ProjectsDatabase
ProjectsRepository mDBRepository;

@Override
public ProjectsServiceImpl get() {
    return new ProjectsServiceImpl(mServerRepository, mDBRepository);
}
}

И последнее - RepositoryProvider (Api или DB - зависит от целей)

public class ProjectsServerRepositoryProvider implements Provider<ProjectsServerRepository> {

@Inject
SomeApi mApi;

@Override
public ProjectsServerRepository get() {
    return new ProjectsServerRepository(mApi);
}
}
...