Для небольшого побочного проекта, над которым я работаю, я пытался реализовать что-то из шаблона DAO для моих взаимодействий с БД и начал использовать Guice (в первый раз) для обработки DI для меня. Сейчас у меня есть этот класс иерархия:Зависимость впрыска с использованием Guice с шаблоном DAO
DAOImpl
принимает ссылку на тип класса, так что мой клиент базы данных (Монго/морфий) может сделать некоторые инициализации работы и создать экземпляр 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)
Любая помощь будет оценена.
Эй, просто хотел отойти назад и сказать спасибо.Я начал новый старомодный путь, вручную вложив deps и проделав свой путь к решению один шаг за раз. Ваш ответ о 'TypeLiteral' доставил мне большую часть пути, но так как мой' DAO' - это интерфейс, который реализован DAOImpl', то для меня это работает: 'bind (новый TypeLiteral> () { }). До (UserDAO.class); bind (новый TypeLiteral >() { }). (PersonDAO.class); связывание (Mongo.class) .то (MongoClient.class); ' –
Justin
А для' Datastore', я в конечном итоге сделать поставщик, как вы предложили и с помощью '@ Singleton' аннотации: ' @Provides @Singleton public Datastore datastoreProvider (MongoClient mongoClient, Конфигурация ServerConfig) { Morphia morphia = new Morphia(); return morphia.createDatastore (mongoClient, config.getMongoConfig(). GetDatabase()); } ' – Justin
@ Justin Я очень рад, что это помогло - удачи в остальной части вашего приложения! –