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

too*_*hcs 45 java architecture spring business-logic

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

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

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

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

比方说,我有一个对象"孩子"有:Name,SurName,Gender,Photo,Birthdate 领域.我如何命名服务?或者你只是让控制器负责验证,这对我来说似乎不对.另一方面,将需要调用的每个setter委托给服务层似乎也不正确.

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

Nat*_*hes 49

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

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

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

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

  • 只是为了补充一点:对于"服务"来说这是一个好主意(不仅仅是在使用Spring时,也可能在暴露远程服务或某种API时),以获得自然的交易候选方法 (4认同)

mat*_*t b 29

如果你想拥有的控制器能够坚持改变一个Child对象,那么传统的你就必须在服务名称类似的方法ChildService.update(Child newchild),将处理调用正确的DAO坚持这个孩子的新版本.

控制器可以自由地问服务对于孩子来说,改变周围的田野(可以想象基于一些用户输入) -一个健全的设计将有控制器做与孩子POJO一些工作,然后询问服务坚持的变化.该模型POJO竟然一无所知控制器,服务或DAO只是简单地保存数据按照你的建议-当然你不会想每次调用setName()setGender()自动导致数据库更新.

相反,控制器和/或服务应取得Child的对象,做任何工作,它需要在它的工作单元的对象,然后问一个服务(再DAO)以保存更改.

验证可以发生在数层-控制器可能要验证从网络用户的任何输入,且服务可能要验证它是否具有有效的Child对象时,它仍然存在之前.如果您想在其他容量中重复使用此服务,例如暴露REST接口,不同的前端等,则在两个层中进行某种级别的验证尤其有意义.