Reputation: 78
I am starting using Toothpick and I need to migrage from Dagger code to Toothpick.
Well, I have next string at my project with Dagger.
@Provides
@Singleton
@Named(ProjectsRepository.DB)
ProjectsRepository provideProjectsDBRepository(ProjectsDBRepository repository) {
return repository;
}
and
@Provides
@Singleton
ProjectsService provideProjectsService(ProjectsServiceImpl serviceImplementation) {
return serviceImplementation;
}
and
@Inject
@Named(ProjectsRepository.SERVER)
ProjectsRepository mServerRepository;
@Inject
@Named(ProjectsRepository.DB)
ProjectsRepository mDBRepository;
@Inject
public ProjectsServiceImpl() {
}
It works fine (beside what I still can't understand what or who put repository/serviceImpelmentation to provide-methods) . Well, I am trying to do the same in Toothpick and do the next:
public RepositoryModule() {
bind(ProjectsRepository.class).withName(ProjectsServer.class).toInstance(new ProjectsServerRepository());
}
then
public ServiceModule() {
bind(ProjectsService.class).toInstance(new ProjectsServiceImpl());
}
and finally
@Inject
@ProjectsServer
ProjectsRepository mServerRepository;
@Inject
@ProjectsDatabase
ProjectsRepository mDBRepository;
@Inject
public ProjectsServiceImpl() {
}
and I have all Qualifiers above.
I install my modules in the Fragment class (Fragment Scope) next way
Scope currentScope = Toothpick.openScopes(ApplicationInstance.class,ProjectsFragment.class);
currentScope.installModules(
new ServiceModule(),
new RepositoryModule());
Toothpick.inject(this, currentScope);
But in the end I am getting NullPointerException that my ProjectsRepository is null, and I can't use method of it's instance.
Where am I making mistakes? Please help to "translate".
Upvotes: 2
Views: 368
Reputation: 78
Well, I just had to use Providers for my goals. Can't say that it is very transparent for using. Thanks to all.
Providers can be used in the next way (show only for Server Repository)
First, ServiceModule
public ServiceModule() {
bind(ProjectsService.class).toProvider(ProjectsServiceImplProvider.class);
}
Second, RepositoryModule
public RepositoryModule() {
bind(ProjectsRepository.class).withName(ProjectsServer.class).toProvider(ProjectsServerRepositoryProvider.class);
}
Third, ServiceImplProvider
public class ProjectsServiceImplProvider implements Provider<ProjectsServiceImpl> {
@Inject
@ProjectsServer
ProjectsRepository mServerRepository;
@Inject
@ProjectsDatabase
ProjectsRepository mDBRepository;
@Override
public ProjectsServiceImpl get() {
return new ProjectsServiceImpl(mServerRepository, mDBRepository);
}
}
And the last - RepositoryProvider (Api or DB - depends on goals)
public class ProjectsServerRepositoryProvider implements Provider<ProjectsServerRepository> {
@Inject
SomeApi mApi;
@Override
public ProjectsServerRepository get() {
return new ProjectsServerRepository(mApi);
}
}
Upvotes: 0