Using AutoMapper ValueResolver

in C#, AutoMapper

AutoMapper is a great tool to help automate the tedious task of mapping Domain Model to View Model and back. However, sometimes, mappings are not as straightforward as a simple one to one, left to right mapping. The example below is a real-world implementation of ValueResolver for mapping date of birth to age:

using System;
using AutoMapper;
 
namespace SomeCompany.SomeProject.Web.Models.ValueResolvers
{
    public class AgeValueResolver : ValueResolver<DateTime?, int>
    {
        protected override int ResolveCore(DateTime? dateOfBirth)
        {
            if (dateOfBirth.HasValue)
            {
                var age = DateTime.Today.Year - dateOfBirth.Value.Year;
 
                if (dateOfBirth.Value > DateTime.Today.AddYears(-age))
                {
                    age--;
                }
 
                return age;
            }
 
            return 0;
        }
    }
}

To use this within your mapping, you could do something like:

CreateMap<IPerson, PersonViewModel>()
    .ForMember(dest => dest.Age, opt => opt.ResolveUsing<AgeValueResolver>()
        .FromMember(src => src.DOB)
    );

Comments