gpt4 book ai didi

java - 使用带有 DAO 模式的 Guice 进行依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-30 08:31:27 24 4
gpt4 key购买 nike

对于我正在从事的一个小型副项目,我一直在尝试为我与数据库的交互实现某种 DAO 模式,并开始使用 Guice(这是我第一次)为我处理 DI。现在我有这个类层次结构:

enter image description here

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

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 绑定(bind)相关类,但我不确定如何去做。这看起来可能已经得到回答,但它并没有为我点击。我尝试了以下一些方法:

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)

如有任何帮助,我们将不胜感激。

最佳答案

如果您想要像下面这样的注入(inject)部位:

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

将注入(inject)您的 UserDAO 实例然后上课

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

correct syntax .

至于你的其他错误:

1) No implementation for org.mongodb.morphia.Datastore was bound.

这是因为Datastore是一个接口(interface)。您需要将接口(interface)绑定(bind)到实现、实例或 Provider<Datastore> .

要了解如何执行此操作,请考虑您需要手动执行此操作而无需使用 Guice 的额外复杂操作的步骤。一旦你 100% 理解了这一点,你就可以尝试设计一个对象图来适本地反射(reflect)吗啡初始化的步骤。

为了帮助您入门,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

您将不得不编写一些代码来设置它,可能使用 Guice 的 Provider类。

关于java - 使用带有 DAO 模式的 Guice 进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40646780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com