注射DAO的最佳实践

时间:2015-01-05 10:22:55

标签: java jpa cdi dao

我正在支付我的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?

0 个答案:

没有答案