浅析MVC中的数据流动
我们知道传统的MVC框架中,会有Controller层、Service层、DAO层,分别用来对接用户界面、处理业务逻辑、对接数据库。那么对于数据流动的处理是怎样的呢?
最早前后端没有分离的时候,Contoller层是会返回一个视图View的,就是一个页面。到后来前后端分离,Controller就仅仅用来返回JSON格式的数据了,但是它的职责不变,1. 校验入参,2.生成并组装出参。在以前入参可能是一个form表单,实际也可以认为它是一个视图,即提交一个视图,转化成模型处理业务逻辑,最后把所需的视图返回出去。因此View Object ,VO就是这么来的。现在为了区分出参和入参,一般地,会将入参取名为Query Object QO , 出参为VO。在Controller,VO转换成DTO(Data Transfer Object)交由对应的Service去处理。
到Service层,DTO会被业务逻辑进行各种处理,可能有各种各样的DTO创建、转换。而数据来源,一方面是由上层过来的DTO,另一方面会从DAO层获取实体Entity。在这一层,会调用各种DAO对数据库的数据进行CRUD。可以理解为Service是直接操作DAO,并且处理业务逻辑。最新的趋势(已经蛮久),增加一个Business层,在Controller层和Service层之间,Business处理更上层的业务,而Service处理基本的业务。可以把Service理解为“业务中台”,Business理解为“业务前台”。
DAO层没有任何业务逻辑,也不应该下沉业务逻辑。这里只应该有原始的数据库操作,供上层调用。
综上,从上到下,QO-DTO-Entity, 从下到上 Entity-DTO-VO。切忌一个对象到底,牵一发而动全身,也忌返回不必要的字段,