从@Provides优化我的代码以绑定到我的guice包中

问题描述 投票:0回答:1

在我的代码中,在模块包中,我使用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);
    }
java dependency-injection guice
1个回答
0
投票

我相信以下应该起作用:

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是通用的,而在另一方面,您会跳过该通用规范,因此为了保持一致,我保留了该通用部分。

© www.soinside.com 2019 - 2024. All rights reserved.