我真的需要服务层吗?

2022-09-01 13:57:05

我的Web应用程序是使用Spring MVC + Hibernate编写的。

  • 我的模型是“客户”实体POJO。
  • 我有一个DAO对象“CustomerDAO”,它的方法“saveCustomer(c)”包含与Hibernate交互的代码;
  • 然后,我用“saveCustomer(c)”方法创建了一个“CustomerService”,该方法只需将客户对象传递给dao进行保存;
  • 最后是“客户控制器”和客户.jsp,他们负责视图层,jsp的表单字段绑定到控制器端的Customer对象。控制器调用服务。

我看到很多应用程序遵循这种(最佳)做法,但我想知道为什么我需要一个服务层。

也许它对解耦目的很有用:我可以向控制器显示一个通用的外观,并注入到服务HibernateDAO,GaeDAO,MyDAO等中。但是我也可以在没有服务的情况下做到这一点:使用接口。

我也反对:验证。我会在服务中进行客户验证,但是....在Spring控制器中验证要方便得多。

请帮我理解这个概念,:)


答案 1

不需要服务层。但是,它可以帮助您

  • 解耦组件
  • 您可以在服务层中强制实施特定的业务规则,这些规则应该与存储库无关
  • 让一个服务外观一个或多个存储库。让我们考虑以下示例
class Service {
  private DatabaseBarRepo barRepo;
  private DatabaseFooRepo fooRepo;

  @Transactional
  public void serviceRoutine() {
     barRepo.doStuff();
     fooRepo.doStuff();
  }
}

在这里,我们让两个独立的存储库参与一事务。这是特定于数据库的,尽管这些原则也适用于其他系统。


答案 2

关键是事务行为。如果没有服务层,您将在哪里划分事务?

  • 在表示层中:这不是事务划分所属的位置,您将无法使用声明性事务划分
  • 在 DAO 层中:您将无法在单个事务中创建客户及其联系人(例如),因为它将使用两个不同的 DAO

此外,您希望UI层尽可能简单,并且业务代码(有时比简单地调用DAO方法复杂得多)隔离在特定组件中。这允许

  • 通过模拟服务层对 UI 层进行单元测试
  • 通过模拟 DAO 层对服务层(业务代码)进行单元测试

推荐