2012-03-09 102 views
26

我的web应用程序是使用Spring MVC + Hibernate编写的。我真的需要服务层吗?

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

我看到了很多的应用程序都遵循这个(最好的)的做法,但我不知道为什么我将需要一个服务层

也许它是有用的解耦p urpose:我可以向控制器显示一个通用外观,并注入HibernateDAO,GaeDAO,MyDAO等服务....但是我也可以在没有该服务的情况下执行此操作:使用接口。

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

请帮我理解这个概念:)

回答

22

标注在服务层的方法,有一个交易跨越多个数据库操作你不需要服务层。但是它可以帮助你

  • 解耦组件
  • 您可以强制在服务层的具体业务规则应该是不可知的资源库
  • 让服务门面的一个或多个存储库。让我们看看下面的示例
class Service { 
    private DatabaseBarRepo barRepo; 
    private DatabaseFooRepo fooRepo; 

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

在这里,我们让两个独立库采取的同一交易的一部分。这对于数据库是特定的,尽管这些原则对其他系统也是有效的。

+1

该服务还可以提供共享逻辑到一个测试服务层(业务代码)或更多的控制器(例如Web控制器和JSON/WS API) – seanhodges 2012-03-09 11:55:24

+4

您也可以通过这种方式轻松地将服务(服务方法)作为Web服务公开... – 2012-03-09 12:04:49

+0

@seanhodges,matjaz,是的确 - 优秀的建议 – 2012-03-09 12:11:24

2

还有其他的东西,你在服务层。有时它会在将任何操作传递给DAO之前应用业务规则。有时一个服务需要与其他服务交互,DAO需要遵守业务规则。

告诉我们你将如何在没有服务器层和界面的情况下完成高层次的想法,这会帮助我更多地告诉你。

6

现在,你的服务层是微不足道的,因为你的服务是数据库访问的简单包装。这是所有的应用程序?如果不是这样,当你开始构建不重要的部分时,你的服务层将会扩展。

6

您可以通过具有所有CRUD操作的BaseService来保存详细信息,并将其委托给注入其中的BaseDAO。

除了CRUD之外,几乎所有其他东西都有独立的逻辑,用于业务逻辑和数据库特定的操作。而另一件事 - 你可以通过@Transactional

21

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

    在表示层
  • :这不是地方事务划分属于,你将无法使用声明式事务划分
  • 在DAO层:你就不能创建一个客户和它的接触(例如)在一个单一的交易,因为它会使用两种不同的DAO

而且,你希望你的UI层尽可能简单,业务代码(有时比sinply调用DAO复杂得多方法)在特定组分中分离。这允许

  • 单元测试UI层由嘲笑服务层
  • 单元通过嘲笑DAO层
+2

+1 * domain facade *风格的服务层对于域模型来说是一个很薄的外观,不是实现任何业务逻辑本身,而是指出事务。使用EJB(而不是Spring)时更明显,其中无状态会话Bean具有容器管理事务。 – Raedwald 2012-03-10 17:11:35