使用带有DAO模式的Guice进行依赖注入

时间:2016-11-17 04:33:53

标签: java generics types guice dao

对于我正在努力实施的小型项目,我一直试图为我与DB的交互实现一些DAO模式,并开始使用Guice(我第一次)来处理DI对我来说。现在我有这个类层次结构:

enter image description here

DAOImpl接受类类型的引用,因此我的数据库客户端(mongo / morphia)可以执行一些初始化工作并实例化morphia提供的BasicDAO。以下是相关课程的片段:

public class DAOImpl<T> implements DAO<T> {
  private static final Logger LOG = LoggerFactory.getLogger(DAOImpl.class);
  private static final String ID_KEY = "id";
  private final org.mongodb.morphia.dao.DAO morphiaDAO;

  @Inject
  public DAOImpl(Datastore ds, Class<T> resourceClass) {
    morphiaDAO = new BasicDAO(resourceClass, ds);

    LOG.info("ensuring mongodb indexes for {}", resourceClass);
    morphiaDAO.getDatastore().ensureIndexes(resourceClass);
  }
}

public class UserDAO extends DAOImpl<User> {
  @Inject
  public UserDAO(Datastore ds) {
    super(ds, User.class);
  }

  public User findByEmail(String email) {
    return findOne("email", email);
  }
}

我知道我需要告诉Guice绑定每个扩展的通用DAOImpl的相关类,但我不确定如何做到这一点。这看起来似乎已经得到了解答,但它并没有为我点击。我尝试了以下一些方法:

public class AppInjector extends AbstractModule {
  @Override
  protected void configure() {
    bind(com.wellpass.api.dao.DAO.class).to(DAOImpl.class);

//    bind(new TypeLiteral<SomeInterface<String>>(){}).to(SomeImplementation.class);
//    bind(new TypeLiteral<MyGenericInterface<T>>() {}).to(new TypeLiteral<MyGenericClass<T>>() {});
//    bind(new TypeLiteral<DAO<User>>() {}).to(UserDAO.class);

    bind(new TypeLiteral<DAO<User>>(){}).to(new TypeLiteral<DAOImpl<User>>() {});
  }
}

这些是我见过的一些错误:

com.google.inject.CreationException: Unable to create injector, see the following errors:

1) No implementation for org.mongodb.morphia.Datastore was bound.
  while locating org.mongodb.morphia.Datastore
    for the 1st parameter of com.wellpass.api.dao.UserDAO.<init>(UserDAO.java:12)
  at com.wellpass._inject.AppInjector.configure(AppInjector.java:18)

2) java.lang.Class<T> cannot be used as a key; It is not fully specified.
  at com.wellpass.api.dao.DAOImpl.<init>(DAOImpl.java:19)
  at com.wellpass._inject.AppInjector.configure(AppInjector.java:14)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

如果您想要一个如下注射部位:

@Inject
public DAOConsumer(DAO<User> dao) {
}

注入你的UserDAO类的实例然后

bind(new TypeLiteral<DAO<User>>() {}).to(UserDAO.class);

correct syntax

至于你的其他错误:

  

1)没有为org.mongodb.morphia.Datastore实施绑定。

这是因为Datastore是一个界面。您需要将接口绑定到实现,实例或Provider<Datastore>

要了解如何执行此操作,请考虑手动执行此操作所需的步骤,而不会出现Guice的额外复杂情况。一旦你100%理解了这一点,你就可以尝试设计一个适当反映morphia初始化步骤的对象图。

为了帮助您入门,morphia quick tour提供了有关如何获取Datastore对象实例的指南:

final Morphia morphia = new Morphia();

// tell Morphia where to find your classes
// can be called multiple times with different packages or classes
morphia.mapPackage("org.mongodb.morphia.example");

// create the Datastore connecting to the default port on the local host
final Datastore datastore = morphia.createDatastore(new MongoClient(), "morphia_example");
datastore.ensureIndexes();

从他们的代码中,您可以看到获取Datastore至少需要两个依赖项:

  1. 单身Morphia
  2. 单身MongoClient
  3. 您可能需要编写一些代码来设置它,可能使用Guice的Provider类。

相关问题