我真的需要服务层吗?

IT小君   2021-12-18T02:51:35

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

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

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

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

我还认为:验证。我将在服务中进行我的客户验证,但是.... 在 Spring 控制器中进行验证要方便得多。

请帮我理解这个概念:)

评论(5)
IT小君

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

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

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

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

2021-12-18T02:51:35   回复
IT小君

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

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

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

  • 通过模拟服务层对 UI 层进行单元测试
  • 通过模拟 DAO 层对服务层(业务代码)进行单元测试
2021-12-18T02:51:35   回复
IT小君

现在,您的服务层是微不足道的,因为您的服务是围绕数据库访问的微不足道的包装。这就是应用程序的全部吗?如果没有,当您开始构建重要部分时,您的服务层将扩展。

2021-12-18T02:51:35   回复
IT小君

您可以通过拥有BaseService包含所有 CRUD 操作的a 来节省冗长,委托给其中注入的 BaseDAO。

除了 CRUD 之外,几乎所有其他东西都有单独的业务逻辑和特定于数据库的操作的逻辑。另一件事 - 您可以通过使用注释服务层方法来使事务跨越多个数据库操作@Transactional

2021-12-18T02:51:35   回复
IT小君

您在服务层还有其他事情要做。有时它是关于在将任何操作传递给 DAO 之前应用业务规则。有时一个服务需要与其他服务交互,DAO 用于业务规则要求。

告诉我们您将如何在没有服务器层和界面的情况下进行……高级想法,将帮助我告诉您更多。

2021-12-18T02:51:35   回复