Java EE项目中的服务层是否有必要通过DAO层与实体进行通信?

Par*_*rag 5 java dao ejb

我正在阅读关于EJB 3.0的这篇文章,其中作者描述了一种体系结构,其中服务层通过作为无状态会话bean实现的DAO与实体进行通信.

我试图理解为什么我们需要这个额外的层.为什么服务层不能直接与实体对话?我想到的一个想法是 - 易于测试.我们可以通过模拟DAO来轻松测试服务层.

这是唯一的原因,还是有其他原因?

nob*_*beh 2

DAO是对如何使用对象访问数据库的抽象。在 DAO 的原始实践中,首先有一个接口定义您期望从数据库执行的操作:

interface ModelDao {
  Model load(Long id);
  Long save(Model object);
}
Run Code Online (Sandbox Code Playgroud)

它可以是通用的,也可以是适合您设计的任何方式。除了接口的高度可测试性之外,DAO 模式还增加了另一个优点,即现在您可以使用不同的技术来实现相同的 DAO 模式。随着时间的推移,您可能需要从 EJB 切换到 Spring JDBC 或任何其他更改。

当这一切发生时,服务层仍然并且只能通过DAO接口看到数据层。实现始终是从服务层封装的。另外,它还通过mock等机制增加了服务层的可测试性。

如果服务层直接开始处理数据层,则意味着服务层变得特定于实现,这除了使仅针对业务逻辑测试服务层变得更加困难之外,还减少了模块化和关注点的耦合。

最后但并非最不重要的一点是,虽然坚持原来的做法总是最好的,但采用该方法取决于产品/项目的规模和意图。