混合 DAO 和服务调用
Mixing DAO and service calls
假设我们在服务层之上有一些层,例如网络控制器。服务层又在DAO/Repo层之上。在上层,服务调用与回购调用一起使用。它在某种程度上打破了应用程序的分层,但我们真的应该费心将像 findAll()
这样的 repo 方法包装到服务方法中吗?我不这么认为。这样的设计有没有什么缺点可能会引起很多痛苦?交易问题?
我会反驳你的问题并说 - 为什么不为这种方法提供服务层?像这样包装 DAO 方法是不是很痛苦:
public class PersonService {
...
private PersonDao personDao;
...
public List<Person> findAll() {
return personDao.findAll();
}
...
}
客户数据
如果您不想将代表 Person 的数据实体发送回您的控制器怎么办?您可以将服务层中的数据映射到仅客户端依赖的对象。
耦合
你也在耦合你的层。控制器层应该只依赖于服务层,服务层应该只依赖于DAO层。
交易
所有事务都应在服务层处理(因为服务方法可能调用多个 DAO 方法)。
业务逻辑
所有业务逻辑都应该在您的服务层中。因此,您永远不应通过直接调用 DAO 来绕过此类逻辑。
我知道,对于像 findAll 这样的方法,它似乎毫无意义,但我认为关于层耦合的观点驳斥了这个论点。
是的,如果某些开发人员过去常常直接从其他层调用 DAO 层代码,即服务层或您为此遵循的任何架构作为解决方案,这可能会很痛苦:
使用 Maven 依赖项为您的项目创建 4-5 个不同的模块,并在 pom.xml
中提及依赖项,这样就不会从任何其他不正确的层进行调用。
为了让它更清楚: -
如果您只想从第 4 层访问第 3 层,只需在第 3 层中为第 4 层添加一个依赖项,因为没有其他模块可以访问第 3 层,它们无法从中调用代码。
这样做你肯定会得到数百个例子。
假设我们在服务层之上有一些层,例如网络控制器。服务层又在DAO/Repo层之上。在上层,服务调用与回购调用一起使用。它在某种程度上打破了应用程序的分层,但我们真的应该费心将像 findAll()
这样的 repo 方法包装到服务方法中吗?我不这么认为。这样的设计有没有什么缺点可能会引起很多痛苦?交易问题?
我会反驳你的问题并说 - 为什么不为这种方法提供服务层?像这样包装 DAO 方法是不是很痛苦:
public class PersonService {
...
private PersonDao personDao;
...
public List<Person> findAll() {
return personDao.findAll();
}
...
}
客户数据 如果您不想将代表 Person 的数据实体发送回您的控制器怎么办?您可以将服务层中的数据映射到仅客户端依赖的对象。
耦合 你也在耦合你的层。控制器层应该只依赖于服务层,服务层应该只依赖于DAO层。
交易 所有事务都应在服务层处理(因为服务方法可能调用多个 DAO 方法)。
业务逻辑 所有业务逻辑都应该在您的服务层中。因此,您永远不应通过直接调用 DAO 来绕过此类逻辑。
我知道,对于像 findAll 这样的方法,它似乎毫无意义,但我认为关于层耦合的观点驳斥了这个论点。
是的,如果某些开发人员过去常常直接从其他层调用 DAO 层代码,即服务层或您为此遵循的任何架构作为解决方案,这可能会很痛苦:
使用 Maven 依赖项为您的项目创建 4-5 个不同的模块,并在 pom.xml
中提及依赖项,这样就不会从任何其他不正确的层进行调用。
为了让它更清楚: -
如果您只想从第 4 层访问第 3 层,只需在第 3 层中为第 4 层添加一个依赖项,因为没有其他模块可以访问第 3 层,它们无法从中调用代码。
这样做你肯定会得到数百个例子。