带有DataReader的AutoMapper DynamicMap针对接口

时间:2013-11-21 16:11:52

标签: c# unity-container automapper

我对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; }
}

1 个答案:

答案 0 :(得分:3)

AutoMapper创建者Jimmy Bogard在另一个论坛回复:

数据读取器映射器不支持接口,只支持具体类。这是因为数据读取器映射器是使用reflection.emit实现的。