LoginSignup
12
9

More than 3 years have passed since last update.

2年目のエンジニアが覚えたAutoMapperの編集機能についてまとめてみた

Last updated at Posted at 2020-04-27

2年目エンジニアのメモ ~AutoMapperで値の転送を行うには~

1. はじめに

先日、業務でAutoMapperについて学習しました。
自分の理解を深めるためにメモを兼ねて記事を作成します。

この記事ではFruit.csApple.csという2つのクラスを作成し、前者から後者へ値を転送するやり方について説明していきます。
ここで扱う転送処理は次の通りです。

  • 単純転送
  • 固定値転送
  • 編集を伴う転送

動作環境

この記事の内容は以下の環境で検証しました。

  • VisualStudio2019
  • AutoMapper v.7.0.1

2. 作り方

FruitクラスからAppleクラスに値を転送する例を書いてみました。
以下のような仕様であると仮定します。

  1. Fruitというクラスを作成し、プロパティにID、産地、賞味期限、ブランドコードの4項目を定義します。
  2. Appleというクラスを作成し、ID、産地、賞味期限、ブランドコード、ブランド名、価格の6項目を定義します。
  3. FruitからAppleの転送仕様は次の通りとします。
Fruit.cs Apple.cs 転送方法
ID ID 同じ項目名の単純転送
Origin ProductionArea 違う項目名の単純転送
ExpirationDate ExpirationDate 3日前を計算して転送
BrandCode BrandCode 同じ項目名の単純転送
- BrandName BrandCodeを元に編集
- Price 固定値転送

先にソースコードをすべて示します。

Fruit.cs
using System;
public class Fruit
{
    public int ID { get; set; }
    public string Origin { get; set; }
    public DateTime ExpirationDate { get; set; }
    public int BrandCode { get; set; }
}
Apple.cs
using System;
public class Apple
{
    public int ID { get; set; }
    public string ProductionArea { get; set; }
    public DateTime ExpirationDate { get; set; }
    public int BrandCode { get; set; }
    public string BrandName { get; set; }
    public decimal Price { get; set; }
}
AppleMappingProfile.cs
using AutoMapper;
public class AppleMappingProfile : Profile
{
    public AppleMappingProfile() : base()
    {
        CreateMap<Fruit, Apple>()
        .ForMember(apple => apple.ProductionArea, option => option.MapFrom(fruit => fruit.Origin))
        .ForMember(apple => apple.ExpirationDate, option => option.MapFrom(fruit => (fruit.ExpirationDate).Add(-3)))
        .ForMember(apple => apple.BrandName, option => option.ResolveUsing<AppleBrandNameResolver>())
        .ForMember(apple => apple.Price, option => option.UseValue(120))
    }
}
AppleBrandNameResolver.cs
using System;
public class AppleBrandNameResolver
{
    public AppleBrandNameResolver : IValueResolver<Fruit, Apple, string>
    {
        public string Resolve(Fruit fruit, Apple apple, string destMember, ResolutionContext context)
        {
            if (fruit.BrandCode.Value == 111) return "ふじ";
            if (fruit.BrandCode.Value == 222) return "ジョナゴールド";
            return "その他の品種";
        }
    }
}

転送仕様を定義するAppleMappingProfile.csというクラスを作成します。
CreateMap<Fruit, Apple>()FruitクラスからAppleクラスへの転送であることを宣言します。
CreateMap<>()の<>の中に編集元項目と編集先項目を入れてマッピングを行います。

(1) 同じ項目名の単純転送

同じ項目名の場合は.ForMemberを書く必要がなく、CreateMap<>()のみで転送が行われます。
Apple.csIDBrandCodeがこちらに当てはまります。

今回はそれぞれFruit.csIDBrandCodeを転送しています。

(2) 違う項目名の単純転送 : MapFrom

.ForMemberメソッドの引数に編集先項目(apple)を取り、MapFromメソッドの引数に編集元項目(fruit)を取ります。
Apple.csProductionAreaがこちらに当てはまります。

今回はFruit.csOriginを転送しています。

(3) 3日前を計算して転送 : MapFrom

.ForMemberメソッドの引数に編集先項目(apple)を取り、MapFromメソッドの引数に編集元項目(fruit)を取ります。
Apple.csExpirationDateがこちらに当てはまります。

MapFromメソッドの => の先で編集元項目(fruit)から計算します。

今回はFruit.csExpirationDateから3日を引いた値を転送しています。

(4) BrandCodeを元に編集 : ValueResolver

.ForMemberメソッドの引数に編集先項目(apple)を取り、ResolveUsingメソッドの型に編集用のValueResolverを取ります。
Apple.csBrandNameがこちらに当てはまります。

ResolveUsingメソッドを使うためにはValueResolverの実装としてAppleBrandNameResolverを用意します。
AppleBrandNameResolverIValueResolverを実装する必要があり、1つ目の型に編集元項目(Fruit)、2つ目の型に編集先項目(Apple)、3つ目の型に設定する項目の型を設定します。

今回はBrandCodeが「111」の場合に「ふじ」、「222」の場合に「ジョナゴールド」、その他の場合は「その他の品種」と返すようにif文で条件を設定しています。

(5) 固定値転送 : UseValue

.ForMemberメソッドの引数に編集先項目(fruit)を取り、UseValueメソッドの引数に固定値として設定する値を取ります。
Apple.csPriceがこちらに当てはまります。

今回は固定値120を転送しています。

3. 使い方

作成したAppleMappingProfile.csを使うためには以下のようにして呼び出します。

FruitExtension.cs
var config = new MapperConfiguration(cfg =>
    {
        cfg.AddProfile<AppleMappingProfile>();
    });
var mapper = config.CreateMapper();
var apple = mapper.Map<Apple>(fruit);

4. まとめ

以上が今回私が学習したAutoMapperの編集機能です。

最初は自分がQiitaに記事を投稿するとは思ってもみませんでしたが、現場リーダーの強要すすめで時間を取っていただき挑戦することができました。
記事の作成にあたり多くのことを教えていただき、本当にありがとうございます。
自分の理解を深めるためにメモを兼ねて書いた記事ですが、自分と同様プログラミングを始めたばかりの方やAutoMapperをこれから使ってみようという方に読んでいただけますと幸いです。

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9