Inyección de dependencia usando Guice con el patrón DAO
Para un pequeño proyecto paralelo en el que estoy trabajando, he estado tratando de implementar algo así como un patrón DAO para mis interacciones con el DB, y he comenzado a usar Guice (por primera vez) para manejar el DI por mí. En este momento tengo esta jerarquía de clases:
DAOImpl
toma una referencia a un tipo de clase para que mi cliente de base de datos (mongo / morphia) pueda hacer un trabajo de inicialización e instanciar unBasicDAO
proporcionado por morphia. Aquí hay fragmentos de las clases relevantes:
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);
}
}
Sé que necesito decirle a Guice que vincule las clases relevantes para cada genéricoDAOImpl
eso se extiende, pero no estoy seguro de cómo hacerlo. Parece que podría haber sido respondido, pero no está haciendo clic para mí. He intentado algunos de los siguientes:
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>>() {});
}
}
Estos son algunos de los errores que he visto:
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)
Cualquier ayuda sería muy apreciada.