[Fork] 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>();

      Mapper.CreateMap<AuditVm, SetNewCardSettings>()
		  .ConstructUsing(src => 
              {
				  SetNewCardSettings settings = new SetNewCardSettings();
				  Mapper.Map<AuditVm, CardBase>(src, settings);
		          return settings;
			  })
		  .IgnoreUnmappedProperties();

      Mapper.CreateMap<CreateCardVm, SetNewCardSettings>()
          .ConstructUsing(src => Mapper.Map<SetNewCardSettings>(src.Audit))
		  .IgnoreUnmappedProperties();
	}
}

public static class AutoMapperExtensions
{
	public static IMappingExpression<TSource, TDestination> IgnoreUnmappedProperties<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
	{
		var typeMap = Mapper.FindTypeMapFor<TSource, TDestination>();
		if (typeMap != null)
		{
			foreach (var unmappedPropertyName in typeMap.GetUnmappedPropertyNames())
			{
				expression.ForMember(unmappedPropertyName, opt => opt.Ignore());
			}
		}
	
		return expression;
	}
}



//// 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; }
}
;