Как ввести с Guice `Module`, где конструктор принимает класс? - PullRequest
2 голосов
/ 10 февраля 2012

Название описывает мою проблему.

Например

public class EntryDAOModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(EntryDAO.class).to(EntryDTOMongoImpl.class); // what should this be?       
    }
}

Как показано, каким должен быть параметр .to, учитывая следующее:

public class GenericDAOMongoImpl<T, K extends Serializable> extends BasicDAO<T, K> {
    public GenericDAOMongoImpl(Class<T> entityClass) throws UnknownHostException {
        super(entityClass, ConnectionManager.getDataStore());
    }
}

public class EntryDAOMongoImpl extends GenericDAOMongoImpl<EntryDTOMongoImpl, ObjectId> implements EntryDAO<EntryDTOMongoImpl> {
    private static final Logger logger = Logger.getLogger(EntryDAOMongoImpl.class);

    @Inject
    public EntryDAOMongoImpl(Class<EntryDTOMongoImpl> entityClass) throws UnknownHostException {
        super(entityClass);
    }
    ...
}

Как я могу создать экземпляр класса EntryDAOMongoImpl следующим образом:

Injector injector = Guice.createInjector(new EntryDAOModule());
this.entryDAO = injector.getInstance(EntryDAO.class); // what should this be?

1 Ответ

2 голосов
/ 10 февраля 2012

Что вам нужно здесь, это создать фабрику. Использование вспомогательной инъекции может помочь вам здесь.

Вы можете увидеть мой предыдущий пост о вспомогательной инъекции

но вот точное решение для вашего случая:

EntryDAOMongoImpl:

public class EntryDAOMongoImpl extends GenericDAOMongoImpl<EntryDTOMongoImpl, ObjectId> implements EntryDAO<EntryDTOMongoImpl> {
    private static final Logger logger = Logger.getLogger(EntryDAOMongoImpl.class);

    @Inject
    public EntryDAOMongoImpl(@Assisted Class<EntryDTOMongoImpl> entityClass) throws UnknownHostException {
        super(entityClass);
    }
    ...
}

Factory:

public interface EntryDAOFactory {
    public EntryDAOMongoImpl buildEntryDAO(Class<EntryDTOMongoImpl> entityClass);
}

Модуль:

public class EntryDAOModule extends AbstractModule {

    @Override
    protected void configure() {
        //bind(EntryDAO.class).to(EntryDAOMongoImpl.class); // what should this be?

        FactoryModuleBuilder factoryModuleBuilder = new FactoryModuleBuilder();
        install(factoryModuleBuilder.build(EntryDAOFactory.class));
    }
}

Использование:

Injector injector = Guice.createInjector(new EntryDAOModule());
EntryDAOFactory factory = injector.getInstance(EntryDAOFactory.class);
this.entryDAO = factory.buildEntryDAO(entityClass);

Если вы собираетесь использовать EntryDAOMongoImpl в качестве сингелтона (естественное использование синглтона imo), то вы можете сделать следующее без вспомогательной инъекции в свой модуль:

public class EntryDAOModule extends AbstractModule {

    @Override
    protected void configure() {
        EtnryDTOMongoImpl dto = new EntryDTOMongoImpl(TargetEntry.class); //guessing here
        bind(EntryDAO.class).toInstance(new EntryDAOMongoImpl(dto)); // singleton   
    }
}

Дайте мне знать, если это поможет

...