CSharp · Console
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; }
}