【发布时间】:2013-07-01 21:11:44
【问题描述】:
我有很多 DTO 对象。每个 dto 类都有方法
convertDTO(Entity entity)-
convertDTOList(List<Entity> entity)
我想为我的 dto 对象转换器 使用设计模式。我可以使用哪种设计模式以及如何使用?
Dozer 框架很好。但我想写一个通用模式。
【问题讨论】:
-
存在解决问题的模式。你想解决什么问题?
我有很多 DTO 对象。每个 dto 类都有方法
convertDTO(Entity entity)convertDTOList(List<Entity> entity)
我想为我的 dto 对象转换器 使用设计模式。我可以使用哪种设计模式以及如何使用?
Dozer 框架很好。但我想写一个通用模式。
【问题讨论】:
如果您使用 Java8,我建议您按照建议 here 使用 DTO 到域转换器模式
下面是一个实现示例:
通用转换器
public interface GenericConverter<I, O> extends Function<I, O> {
default O convert(final I input) {
O output = null;
if (input != null) {
output = this.apply(input);
}
return output;
}
default List<O> convert(final List<I> input) {
List<O> output = new ArrayList<O>();
if (input != null) {
output = input.stream().map(this::apply).collect(toList());
}
return output;
}
}
ConverterDTO
public class AccountCreateRequestConverter implements GenericConverter<AccountCreateRequest, AccountOutput> {
@Override
public AccountOutput apply(AccountCreateRequest input) {
AccountOutput output = new AccountOutput();
output.setEmail(input.getEmail());
output.setName(input.getName());
output.setLastName(input.getLastName());
output.setPassword(input.getPassword());
return output;
}
}
消费者
消费者类:
class Consumer {
@Inject
AccountCreateRequestConverter accountCreateInputConverter;
void doSomething() {
service.registerAccount(accountCreateInputConverter.apply(input));
}
}
这种模式的优势在于易于使用,因为您可以传递单个实体或实体列表,其中可以有其他嵌套的 DTO 使用转换器父类中的专用转换器进行转换。 像这样的:
嵌套集合 DTO 转换器示例
class ParentDTOConverter {
@Inject
ChildDTOConverter childDTOConverter;
void doSomething() {
@Override
public ParentDTOOutput apply(ParentDTOInput input) {
ParentDTOOutput output = new ParentDTOOutput();
output.setChildList(childDTOConverter.convert(input.getChildList()));
}
}
}
【讨论】:
有许多不同的解决方案。你可以在这里找到关于它的讨论 Object Conversion Pattern
【讨论】:
我不太确定您在这里尝试做什么,但纯粹基于您编写的内容,我会说创建一个由您的所有 DTO 实现的接口,可能带有通用参数。
【讨论】: