我开始使用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() {
}
它工作正常(除了我还是不知道是什么,还是谁把存储库/ serviceImpelmentation放在了提供方法之外)。 好吧,我正在尝试在“牙签”中做同样的事情,然后做下一个:
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,并且无法使用其实例的方法。
我在哪里犯错误?请帮助“翻译”。
答案 0 :(得分:0)
好吧,我只需要使用提供程序即可实现我的目标。不能说使用非常透明。 谢谢大家。
提供者可以以另一种方式使用(仅显示服务器存储库)
首先,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);
}
}