如何用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
相关产品推荐
相关产品推荐

