Automapper: How to not repeat mapping config from complex type to base class

CSharp · Console

/Program.cs

using System;
using AutoMapper;
					
public class Program
{
	public static void Main()
	{
      map();
	  Mapper.AssertConfigurationIsValid();
		
		var card = new CreateCardVm()
		{
			Audit = new AuditVm(){ TransId = 1, UserId = "A22", Shift = 3 },
			To = "You",
			From = "Me"
		};
		
		var cmd = Mapper.Map<CreateCardVm, SetNewCardSettings>(card);
		
		cmd.From.Dump();
		cmd.To.Dump();
		cmd.TransId.Dump();
		cmd.UserId.Dump();
		cmd.Shift.Dump();
	}
	
	static void map()
	{
      Mapper.CreateMap<AuditVm, CardBase>()
        .Include<AuditVm, SetNewCardSettings>();

      Mapper.CreateMap<AuditVm, SetNewCardSettings>()
		  .ForMember(dest => dest.To, opt => opt.Ignore())
		  .ForMember(dest => dest.From, opt => opt.Ignore());

      Mapper.CreateMap<CreateCardVm, SetNewCardSettings>()
        .ConvertUsing(src => Mapper.Map<SetNewCardSettings>(src.Audit));
		// or
		//.ConvertUsing(src => Mapper.Map<AuditVm, SetNewCardSettings>(src.Audit));
	}
}

//// VIEW MODELS IN WEB PROJECT
// this class in in a different Area of the application than CardVm
public class CreateCardVm : CardVm 
{
	public AuditVm Audit { get; set; }
}

public class AuditVm
{
	public int TransId {get; set; }
	public string UserId  { get; set; }
	public int Shift { get; set; }
}


public class CardVm
{
	public string To { get; set; }
	public string From { get; set; }
	public string Subject { get; set; }	
}


//// COMMANDS (DTOs) IN DOMAIN PROJECT
public class CardBase
{
  public int TransId {get; set; }
  public string UserId  { get; set; }
  public int Shift { get; set; }
}

// one of the concrete classes
public class SetNewCardSettings : CardBase
{
	public string To { get; set; }
	public string From { get; set; }
}
;