Java 混合DAO和服务调用

Java 混合DAO和服务调用,java,architecture,Java,Architecture,假设我们在服务层之上有一些层,例如web控制器。服务层依次位于DAO/Repo层之上。在上层,服务调用与repo调用一起使用。它在某种程度上打破了应用程序的分层,但我们真的应该考虑将类似findAll()的repo方法包装成服务方法吗。我不这么认为。这样的设计有没有可能带来很多痛苦的缺点?事务性问题?我会把你的问题转过来,然后说——为什么不为这种方法建立一个服务层呢?像这样包装DAO方法是否很痛苦: public class PersonService { ... private

假设我们在服务层之上有一些层,例如web控制器。服务层依次位于DAO/Repo层之上。在上层,服务调用与repo调用一起使用。它在某种程度上打破了应用程序的分层,但我们真的应该考虑将类似
findAll()
的repo方法包装成服务方法吗。我不这么认为。这样的设计有没有可能带来很多痛苦的缺点?事务性问题?

我会把你的问题转过来,然后说——为什么不为这种方法建立一个服务层呢?像这样包装DAO方法是否很痛苦:

 public class PersonService {
 ...
     private PersonDao personDao;
 ...
     public List<Person> findAll() {
         return personDao.findAll();
     }
 ...
 }
公共类PersonService{
...
私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人;
...
公共列表findAll(){
return personDao.findAll();
}
...
}
客户数据 如果您不想将表示人员的数据实体发送回控制器,该怎么办?您可以将服务层中的数据映射到只有客户端依赖的对象

耦合 您还将耦合层。控制器层应该只依赖于服务层,而服务层应该只依赖于DAO层

交易 所有事务都应该在服务层处理(因为一个服务方法可以调用多个DAO方法)

业务逻辑 所有业务逻辑都应该在您的服务层中。因此,决不能通过直接调用DAO来绕过这种逻辑


我知道,对于findAll这样的方法来说,这似乎毫无意义,但我认为关于层耦合的观点驳倒了这一论点。

我想把你的问题转过来,然后说——为什么不为这种方法提供一个服务层呢?像这样包装DAO方法是否很痛苦:

 public class PersonService {
 ...
     private PersonDao personDao;
 ...
     public List<Person> findAll() {
         return personDao.findAll();
     }
 ...
 }
公共类PersonService{
...
私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人;
...
公共列表findAll(){
return personDao.findAll();
}
...
}
客户数据 如果您不想将表示人员的数据实体发送回控制器,该怎么办?您可以将服务层中的数据映射到只有客户端依赖的对象

耦合 您还将耦合层。控制器层应该只依赖于服务层,而服务层应该只依赖于DAO层

交易 所有事务都应该在服务层处理(因为一个服务方法可以调用多个DAO方法)

业务逻辑 所有业务逻辑都应该在您的服务层中。因此,决不能通过直接调用DAO来绕过这种逻辑


我知道,对于findAll这样的方法来说,这似乎毫无意义,但我认为关于层耦合的观点推翻了这一论点。

是的,如果一些开发人员习惯于直接从其他层调用DAO层代码,这可能会是一种痛苦,例如,除了服务层或您作为解决方案遵循的任何体系结构之外: 使用maven dependencies为您的项目创建4-5个不同的模块,并在
pom.xml
中提及依赖项,这样就不会从任何其他不正确的层进行调用。 为了更清楚地说明这一点:- 如果您只想从第4层访问第3层,只需在第3层中为第4层添加一个依赖项,因为没有其他模块可以访问第3层,所以它们无法从中调用代码


这样做肯定会有上百个例子。

是的,如果一些开发人员习惯于直接从其他层调用DAO层代码,例如,服务层或您作为解决方案遵循的任何体系结构以外的层,那么这可能会是一个痛苦的过程: 使用maven dependencies为您的项目创建4-5个不同的模块,并在
pom.xml
中提及依赖项,这样就不会从任何其他不正确的层进行调用。 为了更清楚地说明这一点:- 如果您只想从第4层访问第3层,只需在第3层中为第4层添加一个依赖项,因为没有其他模块可以访问第3层,所以它们无法从中调用代码


这样做肯定会有上百个例子。

+1。另外一点可能是安全性。如果使用方法级安全性并将DAO调用包装到服务中,则只有一个地方需要保护(服务),因为通常只能从某个事务中调用DAO(即从服务层)。这假设DAO本身不是事务性的(正如您所提到的,这也是一个很好的实践)。+1。另外一点可能是安全性。如果使用方法级安全性并将DAO调用包装到服务中,则只有一个地方需要保护(服务),因为通常只能从某个事务中调用DAO(即从服务层)。这假设DAO本身不是事务性的(正如您所提到的,这也是一个很好的实践)。