我可以使用自动映射器在不可变的两个字段之间进行映射吗?
本文关键字:映射 字段 两个 之间 可以使 不可变 我可以 | 更新日期: 2023-09-27 18:33:01
我有以下两个类(为简洁起见,省略了许多属性)。
服务层 POCO:
public class TicketFlag
{
public ContactKey ContactKey;
}
LINQ to SQL 生成的 POCO:
public class TicketFlag
{
public string ContactKey;
}
当尝试使用AutoMapper在服务调用->数据库保存时,我收到以下异常:
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
---> System.ArgumentException: Type 'ContactKey' does not have a default constructor
联系人键没有故意使用默认构造函数。基本上,它需要一个字符串和一个对象列表,并且可以序列化/反序列化自身。
我尝试创建一个映射函数(它是相反的),如下所示:
Mapper.CreateMap<string, ContactKey>().ConvertUsing(s => ContactKeySerializer.Serialize(s));
但我仍然收到投诉,因为 ContactKey 没有默认构造函数。
有没有办法让自动映射器不使用默认构造函数来执行其属性映射?实际上,仅仅映射 ContactKey 上的属性是不够的 - 我需要让它调用构造函数,或者从我的 ContactKeySerializer 类中吐出。
首先,您可能应该为这些内容使用属性,而不是字段。但是,我怀疑这是您问题的一部分。
与其尝试创建从string
到ContactKey
的地图,不如尝试将地图的这一部分从一个TicketFlag
到另一个:
Mapper.CreateMap<LINQtoSQL.TicketFlag, Service.Layer.TicketFlag>()
.ForMember(dest => dest.ContactKey,
mem => mem.ResolveUsing(src => ContactKeySerializer.Serialize(src.ContactKey)));
我认为这可以防止您遇到的错误。
AutoMapper 抱怨您没有默认构造函数,因为 AutoMapper 需要先创建目标类的空实例,然后才能将值映射到它。它不能调用你的合约键的参数化构造函数 - 它怎么会?
在这种情况下,如果构造函数如下所示,则看起来很简单:
public ContracktKey(string keyValue){}
但是,如果它有两个参数呢?
public ContracktKey(string keyValue, string otherValue){}
它怎么知道把值放在哪里?如果只提供一个字符串怎么办?
我认为最好听从别人的建议,绘制两个TicketFlag
对象。