通用DTO转换器模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通用DTO转换器模式相关的知识,希望对你有一定的参考价值。

我有很多DTO对象。每个dto类都有这些方法

  • convertDTO(Entity entity)
  • convertDTOList(List<Entity> entity)

我想为我的dto对象转换器使用设计模式。我可以使用哪种设计模式以及如何使用?

推土机框架很好。但我想写一个通用模式。

答案

如果你使用Java8,我建议使用DTO来建立转换器模式,如建议的here

下面是一个实现示例:

GenericConverter

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实现的接口,可能还有通用参数。

以上是关于通用DTO转换器模式的主要内容,如果未能解决你的问题,请参考以下文章

具有业务对象、DTO 和实体/域对象的数据转换模式

在哪里将 DTO 转换为 ViewModel?

没有找到能够从 AbstractJPAQuery 转换为 DTO 的转换器

一个JavaBean和DTO转换的优秀案例

从 DataTable 到 DTO 的 AutoMapper

DO-DTO相互转换时的性能优化