AutoMapper映射C#类到record类型报构造函数错误解决方法
问题原因
触发该报错的核心是AutoMapper默认的目标实例构造逻辑限制:
- AutoMapper映射生成目标对象时,会优先查找目标类型的无参构造函数;如果找不到无参构造,默认规则要求构造函数的所有入参必须是可选参数,否则无法自动完成实例初始化
- 你定义的目标类型
Stock的构造函数包含stockId、itemName、quantity三个必填非可选参数,虽然你配置了成员映射规则,但AutoMapper默认不会自动将这些成员映射和构造函数入参做关联,因此直接抛出参数不合法的错误。
修复方案
不要为了适配映射规则给领域实体Stock强行添加无参构造函数,该操作会绕过你在构造函数中编写的所有业务校验规则,生成非法状态的实体,违反领域模型的设计约束。推荐以下两种合规修复方式:
方案1:显式指定实例构造逻辑(最推荐)
通过ConstructUsing方法直接告诉AutoMapper如何构造Stock实例,完全绕过默认的构造函数匹配逻辑,原有实体的所有校验逻辑会正常触发。修改后的映射配置如下:
CreateMap<CreateStockRequestDto, Stock>() .ConstructUsing(src => new Stock( stockId: new StockId(Guid.NewGuid().ToString()), itemName: src.Name, quantity: src.Quantity, sku: src.Sku ));
如果后续存在复杂属性映射逻辑,可以直接在该委托内完成处理,不需要额外编写其他成员映射规则。
方案2:显式配置构造函数参数映射
如果不想手动编写实例化代码,可以通过ForCtorParam方法逐个指定构造函数入参的映射来源,AutoMapper会按照配置传入参数调用构造函数:
CreateMap<CreateStockRequestDto, Stock>() .ForCtorParam("stockId", opt => opt.MapFrom(_ => new StockId(Guid.NewGuid().ToString()))) .ForCtorParam("itemName", opt => opt.MapFrom(src => src.Name)) .ForCtorParam("quantity", opt => opt.MapFrom(src => src.Quantity)) .ForCtorParam("sku", opt => opt.MapFrom(src => src.Sku));
这种方式同样不会绕过实体内的业务校验,配置完成后即可正常执行映射。
补充说明:你之前使用的
ForPath、ForMember配置是用来映射实例创建完成后的属性赋值逻辑,在目标实例都无法正常构造的场景下,这些配置不会被执行,这也是之前配置不生效的原因。
内容的提问来源于stack exchange,提问作者Swaroop Shivanna
相关产品推荐
相关产品推荐

