我正在支付我的Technical Debt,我面临的一个问题是DAO与CDI注入的使用。
我确实写了一篇关于DAO injection的博客(当然是使用CDI),它创造了奇迹,我将使用博客的参考来解决我的问题。我现在处于这样一种情况:我有很多数据库表(当然是规范化的),并且为每个表创建DAO不是问题。问题是服务(让我们假设和EJB会话Bean)对许多DAO有“引用”,如下例所示:
@Stateless
public class CustomerServiceEJB implements CustomerServiceLocal, CustomerServiceRemote, CustomerService {
private static final Logger LOGGER = Logger.getLogger(CustomerServiceEJB.class.getName());
@Inject @JPADAO
private CustomerDAO customerDAO;
@Inject @JPADAO
private CustomerAccountDAO customerAccountDAO;
@Inject @JPADAO
private CustumerCredentialDAO customerCredentialDAO;
//And rougly 15 more DAO's.
}
如您所见,如果我们需要使用各种DAO,则该类具有所有DAO的“实例”,这意味着CDI容器必须在使用之前注入所有这些实例。
我想出的一个解决方案是创建一个DAOManager
,其中所有DAO的引用都列在经理中。
示例:
public interface DAOManager {
public CustomerDAO getCustomerDAO();
public CustomerAccountDAO getCustomerAccountDAO();
public CustumerCredentialDAO getCustomerCredentialDAO();
//Etc
}
这是JPA的代表:
@JPADAO
public class JPADAOManager implements DAOManager {
@PersistenceContext
private EntityManager entityManager;
public CustomerDAO getCustomerDAO() {
return new JPACustomerDAO(entityManager);
}
//Etc...
}
最后,在CustomerServiceEJB
中,我可以按如下方式注入DAO:
@Inject @JPADAO
private DAOManager daoManager;
我的问题:我的方法是否正确?如果没有,最好的方法是什么?另外,在使用带有CDI的DAO时我需要考虑什么? 添加了问题: JPADAOManager
是否应该以延迟加载的方式返回DAO?