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);
}
}