我对AutoMapper相对陌生,但是发现它在将WCF服务中的对象转换为DTO(功能很强)方面非常强大.
今天,我遇到了一种我认为应该起作用但失败的情况.我在大多数地方都针对接口进行编程,并且我的许多地图(可以正常工作)实际上将EF实体映射到DTO的接口(即Mapper.CreateMap();).
但是,我遇到了一个数据表,并且想使用AutoMapper进行转换的情况.我很快找到了一些看起来很有希望的样本,但它们却以相对模糊的例外而失败(至少对我而言).
作为测试,我更改了DynamicMap调用以使用DTO的具体实现,并且该方法成功运行.最初,我没有走这条路,因为我先前针对由IoC容器(Unity 3.x)解析的接口创建的所有地图都起作用.
有没有一种方法可以通过界面使用此特定地图,或者在做返回集合的动态地图时必须使用具体的类?
失败:
AutoMapper.Mapper.DynamicMap<IDataReader, IEnumerable<IPunctuationMapDto>>(table.CreateDataReader());
工作方式:
AutoMapper.Mapper.DynamicMap<IDataReader, IEnumerable<PunctuationMapDto>>(table.CreateDataReader());
PunctuationMapperDto:
[DataContract]
public class PunctuationMapDto : IPunctuationMapDto
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string TaggedValue { get; set; }
[DataMember]
public int UntaggedValue { get; set; }
}
IPunctuationMapDto:
public interface IPunctuationMapDto
{
int Id { get; set; }
string TaggedValue { get; set; }
int UntaggedValue { get; set; }
}
解决方法:
AutoMapper的创建者Jimmy Bogard在另一个论坛中回答:
数据读取器映射器不支持接口,仅支持具体的类.这是因为数据读取器映射器是使用reflect.emit实现速度的.