如何创建从实体到 dto 的映射器,其中 dto 嵌套在哪里?

Posted

技术标签:

【中文标题】如何创建从实体到 dto 的映射器,其中 dto 嵌套在哪里?【英文标题】:How do I create a mapper from entity to dto, where dto is nested? 【发布时间】:2021-11-07 22:59:46 【问题描述】:

给出了两个具有对应 dto 的实体

实体:

class GalleryBlock(
    var images: List<Image?>,
    override val sortIndex: Int = 0,
) : ArticleBlock(sortIndex)

class Image(
    var url: String,
    var imageSize: ImageSize,
    override var id: Long,
    override var lastModified: Date,
    override var lastModifiedBy: String? = null ) : DBEntity

enum class ImageSize 
    SMALL,
    MEDIUM,
    LARGE, 

dtos

data class GalleryBlockDto(
    var images: List<ImageDto>,
    override val sortIndex: Int,
) : ArticleBlockDto

data class ImageDto(
    var id: Long,
    var url: String,
    var imageSize: ImageSize,
)

对于映射我写了一个接口Mapper

interface Mapper<E, D> 
    fun fromEntity(entity: E): D

对于从类 Image 到 ImageDto 的映射,我创建了一个类 ImageMapper

@Component
class ImageMapper: Mapper<Image, ImageDto> 
    override fun fromEntity(entity: Image): ImageDto 
        return ImageDto(entity.id, entity.url, entity.imageSize)
    

在映射 GalleryBlock 时,我做了同样的事情,但我得到了类型不匹配。

@Component
class GalleryBlockMapper: Mapper<GalleryBlock, GalleryBlockDto> 
    override fun fromEntity(entity: GalleryBlock): GalleryBlockDto 
        val images = entity.images
        val sortIndex = entity.sortIndex
        return GalleryBlockDto(images, sortIndex)
    

我的方法正确吗?以及如何在不更改 Dto 和实体字段的情况下修复类型不匹配?

【问题讨论】:

【参考方案1】:

在您的 GalleryBlockMapper 中,您将 Image 实例传递给 GalleryBlockDto。但是需要 ImageDto 实例。需要将 ImageMapper 注入到 GalleryBlockMapper 中,才能映射图片。

@Component
class GalleryBlockMapper(private val imageMapper: ImageMapper): Mapper<GalleryBlock, GalleryBlockDto> 
    override fun fromEntity(entity: GalleryBlock): GalleryBlockDto 
        val images = entity.images.map  imageMapper.fromEntity(it) 
        val sortIndex = entity.sortIndex
        return GalleryBlockDto(images, sortIndex)
    

【讨论】:

以上是关于如何创建从实体到 dto 的映射器,其中 dto 嵌套在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用自动映射器时将属性名称的 jsonproperty 设置为 dto?

领域实体、DTO 和视图模型

如何在实体框架的 .Add() 中传递 DTO?

JPA 模式:从实体生成数据传输对象 DTO 并将 DTO 合并到数据库

从实体到 DTO 的转换

JPA的模式:从实体生成数据传输对象DTO并将DTO合并到数据库