在我的代码中,在模块包中,我使用Google guice包中的@Provides进行绑定。这是我的工作代码。
但是我想使用bind而不是@provides来优化代码。我尝试了各种方法,但是得到了不同的例外。有人可以建议我解决方案吗?谢谢
@Provides
@Singleton
@Named(MY_CONSTANT)
public MyObjectRepository myObjectRepository(final DatabaseRepository<ObjectDAO> objectDAODatabaseRepository,
final DefaultMyObjectDAOTranslator defaultMyObjectDAOTranslator) {
return new DynamoDBMyRepository(myDAODatabaseRepository, defaultMyDAOTranslator);
}
@Provides
@Singleton
public DatabaseRepository<MyObjectDAO> myObjectDAODatabaseRepository(final DAOWriter<MyObjectDAO> daoWriter,
final DAORetriever<MyObjectDAO> daoRetriever) {
return new DynamoDBRepository<>(daoWriter, daoRetriever);
}
@Provides
@Singleton
public DAOWriter daoWriter(final IDynamoDBMapper dynamoDBMapper) {
return new DAOWriter(dynamoDBMapper);
}
@Provides
@Singleton
public DAORetriever<MyObjectDAO> myObjectDAORetriever(final IDynamoDBMapper dynamoDBMapper) {
return new DAORetriever<>(dynamoDBMapper, MyObjectDAO.class);
}
我相信以下应该起作用:
bind(MyObjectRepository.class)
.annotatedWith(Names.named(MY_CONSTANT))
.to(DynamoDBMyRepository.class)
.in(Singleton.class);
bind(new TypeLiteral<DatabaseRepository<MyObjectDAO>>(){})
.to(DynamoDBRepository.class)
.in(Singleton.class);
bind(new TypeLiteral<DAOWriter<MyObjectDAO>>(){})
.to(DAOWriter.class)
.in(Singleton.class);
bind(new TypeLiteral<DAORetriever<MyObjectDAO>>(){})
.to(DAORetriever.class)
.in(Singleton.class);
由于有大量的类/文件,所以我没有对此进行测试。另外,有时您会写为DAOWriter
是通用的,而在另一方面,您会跳过该通用规范,因此为了保持一致,我保留了该通用部分。