web-dev-qa-db-fra.com

Automapper dans Web API Controller

J'ai une méthode de contrôleur Car WebAPI comme ci-dessous - note _carService.GetCarData renvoie une collection d'objets CarDataDTO

[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 est un modèle WebAPI que j'ai créé.

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

CarDataDTO est une classe que j'ai créée qui modélise la table DB - je récupère les données via un proc stocké appelé avec 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
}

Si j'ai un point d'arrêt sur la ligne var cars dans mon contrôleur API, je peux voir tout ce qui est retourné comme prévu et j'ai une collection d'objets CarDTO. Cependant, je n'ai pas besoin de WebAPI pour renvoyer le CarDataID, CarID ou Year, c'est pourquoi j'ai créé le modèle d'API CarData.

Comment puis-je facilement utiliser Automapper pour mapper uniquement les propriétés qui me concernent?

Dois-je configurer quelque chose dans ma classe WebApiConfig?

13
Ctrl_Alt_Defeat

Vous pouvez installer le package de nuget AutoMapper à partir de: AutoMapper Et puis déclarer une classe comme:

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

Et puis appelez cela dans votre Global.asax comme ceci:

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

Et si vous souhaitez ignorer certaines propriétés, vous pouvez faire quelque chose comme ceci:

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

Et la façon dont vous utilisez cela pour le mappage est:

DestinationType obj = Mapper.Map<SourceType, DestinationType>(sourceValueObject);
List<DestinationType> listObj = Mapper.Map<List<SourceType>, List<DestinationType>>(enumarableSourceValueObject);
38
Jinish