c# - 带有 DataReader 的 AutoMapper DynamicMap 针对接口(interface)

标签 c# unity-container automapper

我对 AutoMapper 比较陌生,但发现它非常强大,可以将 WCF 服务中的对象转换为 DTO(有点意思)。

今天我遇到了一个我认为应该可行但失败的情况。我在大多数地方都针对接口(interface)进行编程,我的很多映射(有效)实际上将 EF 实体映射到我的 DTO 接口(interface)(即 Mapper.CreateMap();)。

但是我遇到了一个情况,我有一个数据表,我想使用 AutoMapper 来转换它。我很快找到了一些看起来很有希望的样本,但它们总是以相对模糊的异常失败(至少对我而言)。

作为测试,我更改了 DynamicMap 调用以使用 DTO 的具体实现并且它成功运行。我最初没有走这条路,因为我之前针对由我的 IoC 容器 (Unity 3.x) 解析的接口(interface)创建的所有映射都有效。

有没有办法让这个特定的 map 使用接口(interface)工作,或者在做返回集合的动态 map 时我必须使用具体类?

失败:

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

最佳答案

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

数据读取器映射器不支持接口(interface),只支持具体类。这是因为数据读取器映射器是使用 reflection.emit 实现的以提高速度。

关于c# - 带有 DataReader 的 AutoMapper DynamicMap 针对接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126125/

相关文章:

c# - 当其他任务出现故障时,Task.WhenAll AggregateException 不会捕获 TaskCancelledException\OperationCanceledException

c# - 我应该将 Unity 容器传递给我的依赖项吗?

c# - Unity - 通过 XML 的工厂

c# - Automapper - 它可以只映射源对象和目标对象中的现有属性吗?

c# - Automapper - AssertConfigurationIsValid 调用失败但映射仍然有效

c# - AutoMapper 花费 4 秒绘制 19 个对象

c# - 为什么我可以创建一个类的实例而不将其存储到变量中并且仍然可以正常工作?

c# - 类型转换/类型转换性能

c# - 如何在 LINQ to SQL 中禁用附加到的数据库名称

c# - 如何在运行时配置Unity 2.0来拦截INotifyPropertyChanged?