web-dev-qa-db-ja.com

Web API Controllerのオートマッパー

以下のようにCar WebAPIコントローラメソッドがあります-_carService.GetCarDataが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は私が作成したWebAPIモデルです。

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

CarDataDTOは、DBテーブルをモデル化するために作成したクラスです。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
}

APIコントローラーのvar cars行にブレークポイントがある場合、期待どおりにすべてが返され、CarDTOオブジェクトのコレクションがあります。ただし、CarDataID、CarID、またはYearを返すためにWebAPIを必要としないため、CarData APIモデルを作成しました。

Automapperを使用して、関心のあるプロパティのみをマップするにはどうすればよいですか?

WebApiConfigクラスに何か設定が必要ですか?

13
Ctrl_Alt_Defeat

AutoMapper nugetパッケージは次の場所からインストールできます。 AutoMapper そして、次のようなクラスを宣言します。

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

次に、Global.asaxで次のように呼び出します。

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

特定のプロパティを無視したい場合は、次のようなことができます。

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

マッピングにこれを使用する方法は次のとおりです。

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