从界面映射时,使AutoMapper识别具体类型

时间:2012-08-21 14:21:38

标签: .net automapper

我有这样的映射

Mapper.CreateMap<ISomething, ISomethingDto>();

我想配置AutoMapper来构建某些具体类型,具体取决于源的具体类型,而不是生成代理。 例如,我可能有

class SomethingSpecial : ISomething {...}

class SomethingSpecialDto : ISomethingDto{...}

当我打电话

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

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

4 个答案:

答案 0 :(得分:2)

我最终实现了ITypeConverter,它检查ResolutionContext.SourceValue的具体类型并返回正确的映射类型。这可行,但它没有比没有AutoMapper完全实现映射好。

答案 1 :(得分:1)

SomethingSpecialSomethingSpecialDto之间没有联系 您只需映射这些具体的类:

Mapper.CreateMap<SomethingSpecial, SomethingSpecialDto>(); 
Mapper.CreateMap<SomethingNormal, SomethingNormalDto>(); 
// ...

答案 2 :(得分:0)

以下是我目前正在做的事情:

Mapper.CreateMap<IAlpha, IAlpha>();

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

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

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

答案 3 :(得分:0)

听起来你的对象和DTO之间只有1:1,所以不需要为接口创建地图。

Mapper.CreateMap<SomethingSpecial, SomethingSpecialDto>();

如果您在映射阶段处理接口,那么技巧就是将Type作为参数传递给映射调用:

public ISomethingDto DoMap(ISomething something)
{
   return (ISomethingDto) Mapper.Map(something, something.GetType(), typeof(SomethingSpecialDto));
}