我可以使用自动映射器在不可变的两个字段之间进行映射吗?

本文关键字:映射 字段 两个 之间 可以使 不可变 我可以 | 更新日期: 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 类中吐出。

我可以使用自动映射器在不可变的两个字段之间进行映射吗?

首先,您可能应该为这些内容使用属性,而不是字段。但是,我怀疑这是您问题的一部分。

与其尝试创建从stringContactKey的地图,不如尝试将地图的这一部分从一个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对象。