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

2022-08-31 16:58:37

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

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

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

现在,所有这些都在服务层中是有意义的;除了“更新”对象。您是否只是放置一个“更新”函数,仅将对象保存在数据库中?还是您还需要定义那里的逻辑?这就是我的困惑所在,我的理解是春天的物体只是POJO的。那么谁来验证数据呢?

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

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


答案 1

一般来说,Spring服务是事务性的。事情进入特定的服务方法,因为它们应该在同一事务中分组在一起。如果要从数据库中检索对象,对其进行调整并保存新版本,则检索和保存应使用相同的服务方法。因此,您的服务方法是根据您需要应用程序为用户执行的操作来确定的。

我试图限制控制器做与验证http参数相关的工作,决定用什么参数调用什么服务方法,在httpsession或请求中放置什么,重定向或转发到什么视图,或类似的Web相关的东西。

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

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


答案 2

如果您希望控制器能够持久保存对对象的更改,那么传统上,您将在服务中有一个名为 之类的方法,该方法将处理调用正确的DAO以保留此子级的新版本。ChildChildService.update(Child newchild)

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

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

验证可以在多个层中进行 - 控制器可能希望验证来自 Web 用户的任何输入,并且服务可能希望在保留之前验证它是否具有有效对象。在两层中都有一定程度的验证尤其有意义,以防您想要在其他容量中重用此服务 - 例如公开REST接口,不同的前端等。Child


推荐