mvc模式中关于DTO层的简单使用

时间:2021-08-03 17:32:40

1、概念:

DTO:Data Transfer Object,数据传输对象,起到数据封装与隔离的作用

2、应用介绍:

在实际项目中,DTO的分在两层传输,一层是service层向controller层,这一层的DTO封装service执行结果,给controller,简化业务数据,只提取部分业务相关字段或补充处理相关字段,不同业务可能有不同的此类dto,具有业务相关性;

另外一层是controller层向web前端层,这一层DTO封装controller执行结果,返回给前端web,请求返回实体封装类,适用于所有ajax请求返回的类型实体,无业务相关性

实际上,第一层DTO通常会被封装进第二次DTO中,在接口调用如RPC调用中,订阅者只需要拿到简化的业务数据对象,而不用把整个实体bean给对方。

3、实例:

service层向controller层dto:
例如执行秒杀业务,执行结果通常包含状态码、状态信息、执行业务id以及成功的明细数据,把分散的数据进行封装返回给controller

DTO实体类:

public class SeckillExecution {
private long seckillId;

//秒杀执行状态code
private int state;

//秒杀执行状态信息
private String stateInfo;
//不直接使用枚举来定义成员变量属性,因为传输对象以json格式给前台,默认情况下无法处理枚举类型数据
//private SeckillStateEnum seckillStateEnum

//秒杀成功,返回的购买明细实体
private SuccessKilled successKilled;

/**
* 秒杀执行成功初始化
* @param seckillId
* @param seckillStateEnum 封装状态信息的枚举常量
* @param successKilled
*/

public SeckillExecution(long seckillId, SeckillStateEnum seckillStateEnum,SuccessKilled successKilled) {
super();
this.seckillId = seckillId;
this.state = seckillStateEnum.getStateCode();
this.stateInfo = seckillStateEnum.getStateInfo();
this.successKilled = successKilled;
}

/**
* 秒杀执行失败的初始化
* @param seckillId
* @param seckillStateEnum 封装状态信息的枚举常量
*/

public SeckillExecution(long seckillId, SeckillStateEnum seckillStateEnum) {
super();
this.seckillId = seckillId;
this.state = seckillStateEnum.getStateCode();
this.stateInfo = seckillStateEnum.getStateInfo();
}

setter()
getter()
}

service直接返回DTO对象:

public SeckillExecution executeSeckill(。。。){
。。。
}

而实际的业务对象是这样的:

public class Seckill {
private long seckillId;

private String name;

private int number;

private Date startTime;

private Date endTime;

private Date createTime;

setter()
getter()
}

注:在RPC接口调用过程中,把DTO及接口提供给订阅者,而不用冗余的业务实体。

controller层向web前端层dto:

public class SeckillResult<T> {
private static final long serialVersionUID = 1L;

//注意boolean类型的getter方法,不是以get开头,而是以is开头,会影响数据封装,需手动修改
private boolean success;

//返回给前台的实体数据或者字符串
private T data;

//异常信息
private String error;

/**
* 数据获取失败的情况
* @param success
* @param error
*/

public SeckillResult(boolean success, String error) {
super();
this.success = success;
this.error = error;
}

/**
* 数据获取成功,封装数据实体
* @param success
* @param data
* @param error
*/

public SeckillResult(boolean success, T data) {
super();
this.success = success;
this.data = data;
}

setter()
getter()
}

以上内容虽说表层、简单,但都是项目中很使用的东西,更深层次的设计模式理论等,后续再深入、补充。。。

相关文章