2

我开始使用牙签,我需要从匕首代码迁移到牙签。

好吧,我在 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 放入提供方法)。好吧,我正在尝试在 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 类(Fragment Scope)中

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

但最后我得到 NullPointerException 我的 ProjectsRepository 为空,我不能使用它的实例方法。

我在哪里犯错?请帮忙“翻译”。

4

1 回答 1

0

好吧,我只需要使用 Providers 来实现我的目标。不能说使用起来非常透明。谢谢大家。

提供者可以在下一种方式中使用(仅显示服务器存储库)

一、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);
}
}
于 2018-06-25T12:30:54.380 回答