匕首代码有效,如何使牙签代码以相同方式工作?

时间:2018-06-24 12:48:34

标签: android dagger-2 toothpick-di

我开始使用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,并且无法使用其实例的方法。

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

1 个答案:

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