17

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?

1
  • Your base model and DTO model are backwards - the DTO class should be what you transfer over the wire, and the non-DTO class should represent the actual DB object Commented Dec 1, 2020 at 15:59

1 Answer 1

46

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);
Sign up to request clarification or add additional context in comments.

2 Comments

Hi Jinish - how would this then be used in the actual API Method?
Finally, an answer that helped me get it working! Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.