一尘不染

服务层和控制器:谁来照顾什么?

java

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

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

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

现在,所有这些对于服务层来说都是有意义的。除了“更新”对象。您是否只是放置了一个“更新”功能,将对象保存在数据库中?还是您还需要在其中定义逻辑?这就是我的困惑所在,我的理解是Spring中的对象只是POJO的对象。现在,谁来验证数据?

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

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


阅读 219

收藏
2020-09-08

共1个答案

一尘不染

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

控制器可以自由地为孩子请求服务,更改字段(可能基于某些用户输入)-理智的设计将使控制器对子POJO进行一些工作,然后要求服务保留更改。POJO模型应该对控制器,服务或DAO一无所知,而只是按照您的建议简单地保存数据-
当然,您不希望每次调用setName()setGender()自动导致数据库更新。

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

验证可以分几层进行-
控制器可能想要验证来自Web用户的任何输入,服务可能想要验证它是否具有有效Child对象,然后再将其持久化。如果您想以其他功能重用此服务(例如公开REST接口,不同的前端等),则在两层进行某种程度的验证尤其有意义。

2020-09-08