2010-10-07 48 views
35

在课上,我们现在正在学习如何构建Spring应用程序,尽管Spring没有直接参与,但我们学习了如何为DAO和服务层对象创建接口。服务层和控制器:谁照顾什么?

请纠正我,如果我错了: DAO层是相当抽象的:它只是包含CRUD操作,并进一步用于读取数据。(即:让所有的对象,获得特定对象等)

服务层:包含创建事物和删除事物的服务,这是业务逻辑应该在的地方。

现在所有这些在服务层中都是有意义的;除了“更新”对象。你只是把一个“更新”功能,只保存在数据库中的对象?或者你还需要在那里定义逻辑?这是我的困惑所在,我的理解是Spring中的对象只是POJO的。那么谁验证数据?

比方说,我有一个对象 “子” 有:NameSurNameGenderPhotoBirthdate 领域。 我将如何命名这些服务?或者你会让控制器负责验证,这对我来说似乎并不正确。另一方面,将每个需要调用的服务器委派给服务层也不太合适。

所以基本上:帮助我如何定义通过服务层保存对象。

回答

22

如果您希望控制器能够坚持更改为Child对象,那么传统的你会在名字类似ChildService.update(Child newchild)的服务,这将处理调用正确的DAO的方法坚持这个孩子的新版本。

控制器可以自由地为子项请求服务,改变周围的字段(可以根据用户的输入) - 一个理智的设计会让控制器和Child POJO一起工作,然后让服务持久化更改。该模型POJO竟然一无所知控制器,服务或DAO只是简单地保存数据按照你的建议 - 当然你不会想每次调用setName()setGender()自动导致数据库更新。

相反,控制器和/或服务应该获得一个对象,为其工作单元中的对象做所需的任何工作,然后请求一个服务(然后是DAO)来坚持这些更改。

验证可以发生在几个层次 - 控制器可能想要验证来自Web用户的任何输入,并且服务可能要验证它有一个有效的Child对象,然后它保留它。这尤其是很有意义的,在情况下两层验证的一些水平,你想重新使用在其他方面的能力这一服务 - 如暴露REST接口,不同的前端等

35

一般一个春季服务是事务性的。事物进入一个特定的服务方法,因为他们应该在同一个事务中组合在一起。如果你想从数据库中检索一个对象,把它旋转,并保存新版本,检索和保存应该在同一个服务方法中。因此,您的服务方法是根据您的应用程序为用户执行的操作确定的。

我尝试限制控制器执行与验证http参数有关的工作,决定使用什么参数调用什么服务方法,要在httpsession或请求中放置什么,重定向或转发哪些视图或类似的与web相关的东东。

就验证而言:验证控制器中的输入参数是确保没有人能够通过虚假输入破坏您的应用程序的一件好事。控制器中的验证往往是要确保输入在语法上可以正常工作(包括检测注入攻击),而服务级别验证是关于确保数据库中事物的状态与您期望的一致。

所以控制器包含web框架基础架构代码,服务包含应用程序逻辑代码。

+3

只是为了补充一点:这对于一般的“服务”来说是一个好主意(不仅在使用Spring时,但也许在公开远程服务或某种类型的API时)使方法成为事务的自然候选 – 2010-10-08 01:33:59