【问题标题】:The best way for converting the models转换模型的最佳方法
【发布时间】:2019-11-01 06:10:39
【问题描述】:

我的 Web 应用程序有控制器层,它应该从外部服务运行一些操作并发送 ExternalServiceDTO。我的控制器层与 ControllerDTO 一起使用。我有 ControllerDTO 的域模型 - 它是带有域服务 DomainModelService 的 DomainModel。

转换模型的最佳方法是什么?我看到了 2 个选项

  1. ControllerDTO -> DomainModel -> ExternalServiceDTO 这样我们 在准备外部之前首先转换为域模型 dto。外部 dto 将从 DomainModelService 创建。

  2. ControllerDTO -> ExternalServiceDTO 这样,我们只是准备 来自控制器 dto 的外部 dto

请指教

【问题讨论】:

  • 好吧,如果域模型是您的中心模型并且包含外部服务所需的所有数据,那么我会投票支持选项 1。无论如何,您可能需要在 ControllerDTO 和 DomainModel 之间进行转换,所以您唯一需要添加的是 DomainModel 和外部 DTO 之间的转换。这将解耦控制器和外部服务,并允许您轻松添加其他控制器和/或外部服务,而无需为所有可能的排列添加转换。

标签: java spring model-view-controller service architecture


【解决方案1】:

您可以使用库模型映射器。

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>2.3.4</version>
</dependency>

要将 DTO 转换为实体,您可以使用:

      private Entity toEntity(DTO dto) throws ParseException {
          Entity entity = modelMapper.map(dto, Entity.class);
          return entity;
     }

在您的控制器中,您应该通过以下方式注入 Mapper:

     @Autowired
     private ModelMapper modelMapper;

【讨论】:

    【解决方案2】:

    我将使用实现构建器设计模式的 @Builder 注释 (Lombok) 来处理此解决方案。这就是我在日常编码生活中执行此操作的方式。

    public RecordingMetaDataDto toDto(RecordingMetaData metaData) {
        return RecordingMetaDataDto.builder()
                .id(metaData.getId())
                .filename(metaData.getFilename())
                .bucket(metaData.getS3Resource().getBucket())
                .s3key(metaData.getS3Resource().getS3key())
                .durationInMinutes(metaData.getDurationInMinutes())
                .startTime(metaData.getStartTime())
                .endTime(metaData.getEndTime())
                .deviceIdentifier(metaData.getDeviceIdentifier())
                .processingStatus(metaData.getProcessingStatus())
                .storageClass(metaData.getStorageClass())
                .createdAt(metaData.getAudit().getCreatedAt())
                .createdBy(metaData.getAudit().getCreatedBy())
                .modifiedAt(metaData.getAudit().getModifiedAt())
                .modifiedBy(metaData.getAudit().getModifiedBy())
                .build();
    }
    

    maven 的 Lombok 依赖:

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多