带有DataReader的AutoMapper DynamicMap针对接口

我对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实现速度的.

上一篇:升级到自动映射器3后缺少方法


下一篇:CodeGo.net> AutoMapper-使用自定义类型转换器将数据表映射到类对象