我有这样的映射
Mapper.CreateMap<ISomething, ISomethingDto>();
我想配置AutoMapper来构建某些具体类型,具体取决于源的具体类型,而不是生成代理。 例如,我可能有
class SomethingSpecial : ISomething {...}
和
class SomethingSpecialDto : ISomethingDto{...}
当我打电话
Mapper.Map<ISomething, ISomethingDto>(aSomethingSpecial);
我想收到SomethingSpecialDto的实例而没有代理。
答案 0 :(得分:2)
我最终实现了ITypeConverter
,它检查ResolutionContext.SourceValue
的具体类型并返回正确的映射类型。这可行,但它没有比没有AutoMapper完全实现映射好。
答案 1 :(得分:1)
SomethingSpecial
和SomethingSpecialDto
之间没有联系
您只需映射这些具体的类:
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));
}