【问题标题】:Controller calling DAO bypassing Service控制器调用 DAO 绕过服务
【发布时间】:2022-02-06 19:39:02
【问题描述】:

在一个规范的 Spring MVC 实现中,架构是这样的

+--controller
| |
| +--MyController (@Controller, calling MyService)
|
+--service
| |
| +--MyService (interface)
| +--MyServiceImpl (@Service, calls MyDAO)
|
+--dao
| |
| +--MyDAO (interface)
| +--MyDAOImpl (@Repository, MyEntity CRUD)
|
+--entity
  |
  +--MyEntity (@Entity, corresponding to my_table in DB)

我的问题很简单:@Service 的使用对调用层次结构有何贡献?我见过的大多数服务类都只是封装了 DAO 中的方法。

例如:

@Transactional
public List<Entity> getEntities() {
    return entityDAO.getEntities();
}

@Transactional
public void saveEntity(Entity val) {
    entityDAO.saveEntity(val);
}

为什么不绕过它直接从@Controller 调用DAO

相关Is it bad practice that a controller calls a repository instead of a service?(在任何框架之外更抽象地制定)

【问题讨论】:

    标签: spring spring-mvc dao


    【解决方案1】:

    虽然大多数服务类在本质上调用 DAO 类是事实,但您可能希望创建这种结构,因为服务层是您拥有业务逻辑的地方。

    假设您想对用户输入进行一些验证,根据传递的参数进行不同的数据库查询,或者通过将数据库错误转换为适当的业务异常来处理它们。这些是您通常希望在服务层中拥有的东西。

    【讨论】:

    • 听起来很合理。可能是我对简单的服务的经验只是封装了 DAO 而没有其他的只是因为我缺乏接触更复杂的例子
    • 除了提到的那些事情之外,将数据库对象和域模型分开是一个很好的做法。
    猜你喜欢
    • 2018-01-31
    • 2013-04-20
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多