You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Mapperly实现多源到含required init属性类型的映射?

用Mapperly实现多数据源到带required init属性的VehicleRecord映射方案

核心思路

Mapperly支持多参数的自定义映射方法,通过这种方式可以同时接收VehicleContract和userId两个数据源,再将数据映射到带required { get; init; }的VehicleRecord实体中。以下是具体实现步骤:

1. 定义示例类

先明确涉及的契约类和实体类结构:

// 请求体传入的契约类
public class VehicleContract
{
    public string LicensePlate { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
}

// 带required init属性的数据库实体
public record VehicleRecord
{
    public required string Id { get; init; }
    public required string LicensePlate { get; init; }
    public required string Model { get; init; }
    public required int Year { get; init; }
    public required string OwnerUserId { get; init; }
}

2. 编写Mapperly映射器

通过创建多参数的映射方法,结合Mapperly的自动映射+手动补充参数的方式实现:

using Riok.Mapperly.Abstractions;

[Mapper]
public partial class VehicleMapper
{
    // 自定义多参数映射方法,同时接收契约对象和userId
    public partial VehicleRecord MapToVehicleRecord(VehicleContract contract, string userId);

    // 手动补充userId到OwnerUserId的映射,其他属性由Mapperly自动处理
    partial void MapToVehicleRecord(VehicleContract contract, string userId, VehicleRecord.Builder builder)
    {
        builder.OwnerUserId = userId;
        // 若有属性名不一致或需要自定义逻辑,可在此补充,比如:
        // builder.Id = Guid.NewGuid().ToString();
    }
}

3. 调用映射方法

使用时直接传入两个数据源即可:

var mapper = new VehicleMapper();
var contract = new VehicleContract { /* 赋值请求体数据 */ };
string userId = "从认证获取的用户ID";
var vehicleRecord = mapper.MapToVehicleRecord(contract, userId);

关键说明

  • 之前使用MapProperty失败是因为它主要用于单数据源的属性映射,多数据源场景需要依赖多参数映射方法。
  • Mapperly的Builder模式会自动适配required init属性的初始化要求,确保所有必填属性都被赋值。
  • 若需要生成Id这类自增或随机值,可在手动映射的部分直接赋值,或者将其作为第三个参数传入映射方法。

内容的提问来源于stack exchange,提问作者Tar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:22:17