Automapper in WebAPI Controller

20,858

You could install the AutoMapper nuget package from: AutoMapper And then declare a class like:

public class AutoMapperConfig
{
    public static void Initialize()
    {
        Mapper.Initialize((config) =>
        {
            config.CreateMap<Source, Destination>().ReverseMap();
        });
    }
}

And then call this in your Global.asax like this:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AutoMapperConfig.Initialize();
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

And if you would like to ignore certain properties then you could do something like this:

Mapper.CreateMap<Source, Destination>()
  .ForMember(dest => dest.SomePropToIgnore, opt => opt.Ignore())

And the way you use this for mapping is:

DestinationType obj = Mapper.Map<SourceType, DestinationType>(sourceValueObject);
List<DestinationType> listObj = Mapper.Map<List<SourceType>, List<DestinationType>>(enumarableSourceValueObject);
Share:
20,858
Ctrl_Alt_Defeat
Author by

Ctrl_Alt_Defeat

Updated on July 09, 2022

Comments

  • Ctrl_Alt_Defeat
    Ctrl_Alt_Defeat almost 2 years

    I have a Car WebAPI controller method as below - note _carService.GetCarData returns a collection of CarDataDTO objects

    [HttpGet]
    [Route("api/Car/Retrieve/{carManufacturerID}/{year}")]
    public IEnumerable<CarData> RetrieveTest(int carManufacturerID, int year)
    {
        //Mapper.Map<>
        var cars = _carService.GetCarData(carManufacturerID, year);
        //var returnData = Mapper.Map<CarData, CarDataDTO>();
        return cars;
    }
    

    CarData is a WebAPI model I have created.

    public class CarData
    {
        public string Model { get; set; }
        public string Colour { get; set; }
        //other properties removed from brevity
    }
    

    CarDataDTO is a class I have created that models the DB Table - I retrieve the Data via a stored proc called with dapper.

    public class CarDataDTO
    {
        public int CarID { get; set; }
        public int CarManufacturerID { get; set; }
        public int Year { get; set; }
        public string Model { get; set; }
        public string Colour { get; set; }
        //other properties removed from brevity
    }
    

    If I have a breakpoint on the var cars line in my API controller I can see everything returned as expected and I have a collection of CarDTO objects. However, I don't require the WebAPI to return the CarDataID, CarID or Year which is why I created the CarData API model.

    How can I easily use Automapper to only map the properties I am concerned with?

    Do I need something set up in my WebApiConfig class?