AutoMapper - 继承映射不​​起作用,相同的源,多个目标

kda*_*awg 12 c# inheritance automapper automapper-2

我可以在AutoMapper(v2.2)中使用具有相同Source类型但不同Destination类型的映射的继承映射吗?

我有这个基本情况(真正的类有更多的属性):

public abstract class BaseViewModel
{
    public int CommonProperty { get; set;}
}

public class ViewModelA : BaseViewModel
{
    public int PropertyA { get; set; }
}

public class ViewModelB : BaseViewModel
{
    public int PropertyB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ViewModelA并且ViewModelB是同一个Entity类的不同表示:

public class Entity
{
    public int Property1 { get; set; }
    public int Property2 { get; set; }
    public int Property3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想BaseViewModel为每个ViewModel 重用相同的映射,例如:

Mapper.CreateMap<Entity, BaseViewModel>()
    .Include<Entity, ViewModelA>()
    .Include<Entity, ViewModelB>()
    .ForMember(x => x.CommonProperty, y => y.MapFrom(z => z.Property1));

Mapper.CreateMap<Entity, ViewModelA>()
    .ForMember(x => x.PropertyA, y => y.MapFrom(z => z.Property2));

Mapper.CreateMap<Entity, ViewModelB>()
    .ForMember(x => x.PropertyB, y => y.MapFrom(z => z.Property3));
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这似乎不起作用.这些电话是这样的:

var model = Mapper.Map<Entity, ViewModelA>(entity);
Run Code Online (Sandbox Code Playgroud)

结果model具有PropertyA映射,但不是CommonProperty.我相信我正在遵循https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance中的示例,但我担心使用相同的Source类型创建多个地图会使AutoMapper绊倒.

任何见解?我喜欢将Base类映射分组在一起的想法,但这似乎不起作用.

Jor*_*dão 15

不幸的是,在这种情况下,AutoMapper似乎只为每个源类型注册一个子类映射,最后一个(ViewModelB).这可能是为了使用并行层次结构而不是单一源类型.

要解决此问题,您可以在扩展方法中封装公共映射:

public static IMappingExpression<Entity, TDestination> MapBaseViewModel<TDestination>(this IMappingExpression<Entity, TDestination> map)
  where TDestination : BaseViewModel { 
  return map.ForMember(x => x.CommonProperty, y => y.MapFrom(z => z.Property1));
}
Run Code Online (Sandbox Code Playgroud)

并在单个子类映射中使用它:

Mapper.CreateMap<Entity, ViewModelA>()
  .MapBaseViewModel<ViewModelA>()
  .ForMember(x => x.PropertyA, y => y.MapFrom(z => z.Property2));

Mapper.CreateMap<Entity, ViewModelB>()
  .MapBaseViewModel<ViewModelB>()
  .ForMember(x => x.PropertyB, y => y.MapFrom(z => z.Property3));
Run Code Online (Sandbox Code Playgroud)