服务层和控制器:谁负责什么?

时间:2010-10-07 20:36:41

标签: java spring architecture business-logic

在课堂上我们现在正在学习如何构建Spring应用程序,即使spring没有直接参与,我们也学会了如何为DAO和服务层对象创建接口。

如果我错了,请纠正我: DAO层非常抽象:它只包含CRUD操作,并且还用于读取数据。(即:获取所有对象,获取特定对象等)

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

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

假设我有一个对象“孩子” 它有:NameSurNameGenderPhotoBirthdate 领域。 我如何命名服务?或者你只是让控制器负责验证,这对我来说似乎不对。另一方面,将需要调用的每个setter委托给服务层似乎也不正确。

基本上就是这样:帮助我定义如何通过服务层定义保存对象。

2 个答案:

答案 0 :(得分:44)

通常,Spring服务是事务性的。事情进入特定的服务方法,因为它们应该在同一个事务中组合在一起。如果要从数据库中检索对象,将其旋转并保存新版本,则检索和保存应该在同一服务方法中。因此,您的服务方法是根据应用程序为用户执行的操作确定的。

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

验证如下:验证控制器中的输入参数是一件好事,以确保没有人可以通过虚假输入破坏您的应用程序。控制器中的验证倾向于确保输入在语法上是正确的(包括检测注入攻击),而服务级验证则是确保数据库中的事物状态符合您的预期。

因此,控制器包含Web框架基础结构代码,服务包含应用程序逻辑代码。

答案 1 :(得分:29)

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

控制器可以自由地向服务部门询问Child,更改字段(可以想象地基于某些用户输入) - 理智的设计会让Controller与Child POJO一起工作,然后要求服务部门保持更改。模型POJO应该对控制器,服务或DAO一无所知,只是按照您的建议简单地保存数据 - 当然,您不希望每次调用setName()setGender()都自动导致数据库更新。

相反,控制器和/或服务应该获取一个Child对象,对其工作单元中的对象执行所需的任何工作,然后请求服务(然后是DAO)保留更改

验证可以在多个层中进行 - Controller可能希望验证来自Web用户的任何输入,并且服务可能希望在它持续存在之前验证它是否具有有效的Child对象。如果您想在其他容量中重复使用此服务,例如暴露REST接口,不同的前端等,则在两个层中进行一定程度的验证尤其有意义。