Внедрить экземпляр БД для статической доступности и доступности экземпляра - PullRequest
3 голосов
/ 10 февраля 2011

У меня есть POJO, который используется с RequestFactory GWT и связанным прокси. POJO имеет как статические методы (list()), так и методы экземпляра (persist()), которым требуется доступ к моей базе данных. Мой пул соединений с базой данных настроен так, что он вводится как единый пакет через Guice. В чем я не уверен, так это как именно я могу выполнить инъекцию, чтобы оба эти типа методов могли получить к ней доступ?

Кроме того, экземпляры POJO создаются с использованием пустого конструктора, что сводит на нет возможность использовать инжекцию конструктора.

Вот пример POJO для справки:

public class Person {
    private Integer id;
    private String name;

    public Integer getId() { return this.id; }
    public void setId(Integer id) { this.id = id; }
    public String getName() { return this.name; }
    public void setName(String name) { this.name = name; }

    public void persist() {
        //TODO: save state to DB
    }
    public static List<Person> list() {
        //TODO: get all people from DB
        return null;
    }
}

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Pojo не обязательно должен быть инстанцируемым по умолчанию, если вы используете Locator для управления тем, как код сервера RequestFactory получает экземпляры ваших POJO, реализуя Locator.find() в соответствии с вашим объектом домена.Локаторы также позволяют вам использовать доменные объекты, которые не соответствуют протоколу getId() / getVersion().

@ProxyFor(value = Person.class, locator = PersonLocator.class)
interface PersonProxy extends EntityProxy { .... }

Если вам нужно изменить поведение для большинства ваших доменных pojos, вы можете добавить ServiceLayerDecorator, который перегружает createDomainObject() и loadDomainObject().

2 голосов
/ 11 февраля 2011

Каким-то образом стиль GWT до сих пор не очень осведомлен о потребностях внедрения зависимостей. Это - в некоторой степени - извините на стороне клиента, но не настолько на стороне сервера (и, честно говоря, я действительно хотел бы, чтобы команда GWT и Guice объединили свои усилия, чтобы улучшить эту ситуацию.)

Теперь, к счастью, Guice предоставляет «унаследованный» механизм для инъекции статических полей, см. «Статические инъекции» в http://code.google.com/docreader/#p=google-guice&s=google-guice&t=Injections). Таким образом, вы можете внедрить свой EntityManager / EntityManagerFactory (или все, что вы используете для выполнения постоянства) в статическое поле.

Вам не нужно делать это напрямую, но вы можете использовать провайдера. Затем выберите правильную область (например, @RequestScoped), чтобы поставщик предоставил вам правильный экземпляр.

Примечание: Я еще не пробовал (хотя я планирую это сделать), потому что я еще не использую RequestFactory в реальном проекте. Я надеюсь, что устаревший механизм работает в этом случае, но вы можете преодолеть некоторые препятствия (?)

...