Метод производителя CDI для модели данных

Я хотел бы иметь возможность @Inject модели данных, поддерживающей RichFaces 4 ExtendedDataTable, но для этого требуется EntityManager для выполнения своей работы. Конечно, запросы EntityManager должны знать класс, и я бы предпочел не передавать его в вызовы методов (в этом случае методы не вызываются моим кодом); в идеале это было бы в конструкторе.

Что-то вроде этого:

public class DataModel<T> {
    @Inject private EntityManager em;
    private Class<T> entityClass;

    public DataModel(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    //Sample method - this class will handle much more complex queries
    public T findEntity(String key) {
        return em.find(entityClass, key);
    }

Можно ли создать CDI @Producer, который можно использовать для внедрения этой модели данных в мои вспомогательные компоненты? Я подумал о создании квалификатора, чтобы вы могли сделать что-то вроде

@Inject @JType(value = MyEntity.class) DataModel<MyEntity> dataModel;

Но это казалось неуклюжим, и также потребовало бы, чтобы мой @Producer вызывал new(), что, я думаю, не позволило бы внедрить EntityManager в DataModel. Также я не уверен, как вы потребуете, чтобы квалификатор был добавлен разработчиком.

Или, возможно, есть лучший способ приблизиться к этому, и я что-то упускаю?


person tdm    schedule 22.07.2011    source источник
comment
Я бы следовал твоему внутреннему чутью. Чрезмерное применение шаблонов проектирования и фреймворков — плохой дизайн, это инструменты для общения.   -  person Jonathan S. Fisher    schedule 16.02.2012


Ответы (1)


Я делаю это с помощью seam-persistence модуль из шва3. :

Режиссер :

public class EntityManagerProducer {

   @Produces
   @ExtensionManaged
   @ConversationScoped
   @PersistenceUnit(unitName = "yourUnitName")
   private EntityManagerFactory emf;
}

Затем вы можете @Inject менеджера сущностей.

В противном случае есть многообещающий проект DeltaSpike (никогда не использовавшийся это еще)

person baraber    schedule 01.08.2012
comment
Спасибо за ответ! Прошел год, и я перешел к другим проектам, поэтому я не могу проверить, решит ли это проблему или нет, но я подозреваю, что да. - person tdm; 08.08.2012