1

我有这样的映射

Mapper.CreateMap<ISomething, ISomethingDto>();

我想将 AutoMapper 配置为根据源的具体类型构造某些具体类型,而不是生成代理。例如,我可能有

class SomethingSpecial : ISomething {...}

class SomethingSpecialDto : ISomethingDto{...}

当我打电话

Mapper.Map<ISomething, ISomethingDto>(aSomethingSpecial);

我想收到SomethingSpecialDto 的实例,但没有代理。

4

4 回答 4

2

我最终实现了一个ITypeConverter,它检查具体类型ResolutionContext.SourceValue并返回正确的映射类型。这行得通,但并不比完全不使用 AutoMapper 实现映射好多少。

于 2012-08-23T08:45:19.620 回答
1

SomethingSpecial和之间没有联系SomethingSpecialDto
你只需要映射那些具体的类:

Mapper.CreateMap<SomethingSpecial, SomethingSpecialDto>(); 
Mapper.CreateMap<SomethingNormal, SomethingNormalDto>(); 
// ...
于 2012-08-21T14:29:44.960 回答
0

听起来您的对象和 DTO 之间是 1:1 的,因此无需针对接口创建映射。

Mapper.CreateMap<SomethingSpecial, SomethingSpecialDto>();

如果您在映射阶段处理接口,诀窍是将类型作为参数传递给映射调用:

public ISomethingDto DoMap(ISomething something)
{
   return (ISomethingDto) Mapper.Map(something, something.GetType(), typeof(SomethingSpecialDto));
}
于 2014-02-25T14:44:40.887 回答
0

这是我目前正在做的事情:

Mapper.CreateMap<IAlpha, IAlpha>();

Mapper.Map<IAlpha, IAlpha>(alphaDAO, new AlphaDTO());

只要属性匹配,这应该适用于两个不同的接口,但我无法通过实际测试来支持它。

我不确定你是否想让 AutoMapper 知道要自动创建哪个对象,但我觉得这可能不是一个选择。至少,它需要在 CreateMap 方法中有一个额外的参数,该参数采用您希望它在遇到给定 Map 时实例化的具体类型,但它的限制太大了。最后,最好将两个具体类相互映射。即使你映射到 AlphaDTO 类型,你仍然可以返回 IAlpha。

于 2012-09-06T19:42:00.670 回答