Dagger 代码有效,如何使 Toothpick 代码以同样的方式工作?
Dagger code works, how to make that Toothpick code work the same way?
我开始使用 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() {
}
它工作正常(除此之外我仍然不明白是什么或谁将 repository/serviceImpelmentation 用于提供方法)。
好吧,我正在尝试在 Toothpick 中做同样的事情并做下一步:
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 class(Fragment Scope)中
Scope currentScope = Toothpick.openScopes(ApplicationInstance.class,ProjectsFragment.class);
currentScope.installModules(
new ServiceModule(),
new RepositoryModule());
Toothpick.inject(this, currentScope);
但最后我收到 NullPointerException,我的 ProjectsRepository 为空,我无法使用它的实例方法。
我哪里出错了?请帮助 "translate".
好吧,我只需要使用提供程序来实现我的目标。不能说使用起来很透明。
感谢大家。
Provider 可以在接下来的方式中使用(仅针对 Server Repository 显示)
首先是服务模块
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);
}
}
我开始使用 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() {
}
它工作正常(除此之外我仍然不明白是什么或谁将 repository/serviceImpelmentation 用于提供方法)。 好吧,我正在尝试在 Toothpick 中做同样的事情并做下一步:
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 class(Fragment Scope)中
Scope currentScope = Toothpick.openScopes(ApplicationInstance.class,ProjectsFragment.class);
currentScope.installModules(
new ServiceModule(),
new RepositoryModule());
Toothpick.inject(this, currentScope);
但最后我收到 NullPointerException,我的 ProjectsRepository 为空,我无法使用它的实例方法。
我哪里出错了?请帮助 "translate".
好吧,我只需要使用提供程序来实现我的目标。不能说使用起来很透明。 感谢大家。
Provider 可以在接下来的方式中使用(仅针对 Server Repository 显示)
首先是服务模块
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);
}
}