public static void Main()
IMapper mapper = new MapperConfiguration(cfg => cfg.AddProfile<MappingProfile>())
mapper.ConfigurationProvider.AssertConfigurationIsValid();
Console.WriteLine("mapper.ConfigurationProvider.AssertConfigurationIsValid();");
Console.WriteLine("-- Create a domain model --");
var emailTask = new EmailTask(
new DateTime(2021, 2, 18),
new Email("test@email.com", "test subject", "test body"),
Console.WriteLine(emailTask);
Console.WriteLine("-- Mapping from domain model to dbo --");
var emailDbo = mapper.Map<EmailDbo>(emailTask);
Console.WriteLine(emailDbo);
Console.WriteLine("-- Mapping from dbo back to domain model --");
var emailTask2 = mapper.Map<EmailTask>(emailDbo);
Console.WriteLine(emailTask2);
public string SendTo { get; private set; }
public string Subject { get; private set; }
public string Body { get; private set; }
public DateTime? DateSent { get; private set; }
public Email(string sendTo, string subject, string body, DateTime? dateSent = null)
this.DateSent = dateSent;
public enum EmailTaskStatus
public int Id { get; private set; }
public DateTime DateCreated { get; private set; }
public Email PayerEmail { get; private set; }
public Email AdminEmail { get; private set; }
public bool DownloadAvailableForAdmin { get; private set; }
public EmailTaskStatus Status { get; private set; }
public EmailTask(int emailId, DateTime dateCreated, Email payerEmail, Email adminEmail,
bool downloadAvailable, EmailTaskStatus status)
this.DateCreated = dateCreated;
this.PayerEmail = payerEmail;
this.AdminEmail = adminEmail;
this.DownloadAvailableForAdmin = downloadAvailable;
public override string ToString()
return JsonConvert.SerializeObject(this, Formatting.Indented);
public int EmailId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime? DateSent { get; set; }
public string SendTo { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public bool DownloadAvailable { get; set; }
public DateTime? AdminDateSent { get; set; }
public string AdminEmail { get; set; }
public string AdminSubject { get; set; }
public string AdminBody { get; set; }
public int StatusId { get; set; }
public override string ToString()
return JsonConvert.SerializeObject(this, Formatting.Indented);
public class MappingProfile : Profile
CreateMap<EmailTask, EmailDbo>()
.ForMember(dest => dest.EmailId, opts => opts.MapFrom(src => src.Id))
.ForMember(dest => dest.SendTo, opts => opts.MapFrom(src => src.PayerEmail.SendTo))
.ForMember(dest => dest.Subject, opts => opts.MapFrom(src => src.PayerEmail.Subject))
.ForMember(dest => dest.Body, opts => opts.MapFrom(src => src.PayerEmail.Body))
.ForMember(dest => dest.DateSent, opts => opts.MapFrom(src => src.PayerEmail.DateSent))
.ForMember(dest => dest.DownloadAvailable, opts => opts.MapFrom(src => src.DownloadAvailableForAdmin))
.ForMember(dest => dest.AdminEmail, opts =>
opts.PreCondition(src => (src.AdminEmail != null));
opts.MapFrom(src => src.AdminEmail.SendTo);
.ForMember(dest => dest.AdminSubject, opts =>
opts.PreCondition(src => (src.AdminEmail != null));
opts.MapFrom(src => src.AdminEmail.Subject);
.ForMember(dest => dest.AdminBody, opts =>
opts.PreCondition(src => (src.AdminEmail != null));
opts.MapFrom(src => src.AdminEmail.Body);
.ForMember(dest => dest.AdminDateSent, opts =>
opts.PreCondition(src => (src.AdminEmail != null));
opts.MapFrom(src => src.AdminEmail.DateSent);
.ForMember(dest => dest.StatusId, opts => opts.MapFrom(src => (int)src.Status))
.ForCtorParam("status", opts => opts.MapFrom(src => src.StatusId))
.ForMember(dest => dest.PayerEmail, opts => opts.MapFrom<PayerEmailValueResolver>())
.ForMember(dest => dest.AdminEmail, opts => opts.MapFrom<AdminEmailValueResolver>());
public class PayerEmailValueResolver : IValueResolver<EmailDbo, EmailTask, Email>
public Email Resolve(EmailDbo emailDbo, EmailTask emailTask, Email email, ResolutionContext context)
return new Email(emailDbo.SendTo, emailDbo.Subject, emailDbo.Body, emailDbo.DateSent);
public class AdminEmailValueResolver : IValueResolver<EmailDbo, EmailTask, Email>
public Email Resolve(EmailDbo emailDbo, EmailTask emailTask, Email email, ResolutionContext context)
if (String.IsNullOrWhiteSpace(emailDbo.AdminEmail) &&
String.IsNullOrWhiteSpace(emailDbo.AdminSubject) &&
String.IsNullOrWhiteSpace(emailDbo.AdminBody) &&
!emailDbo.AdminDateSent.HasValue)
return new Email(emailDbo.SendTo, emailDbo.Subject, emailDbo.Body, emailDbo.DateSent);