AutoMapper は、一見複雑そうに見える問題――あるオブジェクトから別のオブジェクトへの手動マッピング――を解決するための、シンプルで小さなライブラリです。この種のプロパティ代入コードは繰り返しが多く退屈なものですが、AutoMapper はオブジェクト間のマッピングを自動化するツールです。
オブジェクト間マッパー:ある型の入力オブジェクトを、別の型の出力オブジェクトに変換します。
AutoMapper には一連の規約が組み込まれており、ターゲットクラスが命名規約に従っていれば、ほぼゼロ設定で2つの型の間のマッピングを完了できます。
マッピングコードを手書きするのは面倒ですが、それをテストするのはさらに面倒です。AutoMapper はシンプルな型設定を提供するとともに、マッピングロジックの単体テストもサポートしています。
インストール
NuGet パッケージマネージャーコンソールからインストール
PM> Install-Package AutoMapper
関連拡張パッケージ
- AutoMapper.Data:ADO.NET をサポートし、
IDataReaderからデータを読み取ってマッピング可能 - AutoMapper.EF6:EF6 用の拡張メソッドで、非同期
ProjectToプロジェクションを提供 - AutoMapper.Collection:コレクションの等価マッピング。2つのコレクションを比較し、オブジェクトの等価性を判定
- AutoMapper.Collection.EF:EF の主キーと組み合わせて等価判定を行い、コレクションの追加・更新・削除を自動処理。DTO コレクションからデータベースエンティティコレクションへの永続化を実現
従来の手動オブジェクト代入の例
People(ソース)と Person(ターゲット)の2つのクラスがあり、プロパティ名は完全に同じ
class People
{
public int Age { set; get; }
public string Name { set; get; }
}
class Person
{
public int Age { set; get; }
public string Name { set; get; }
}Code language: JavaScript (javascript)
従来の書き方:プロパティを手動で1つずつ代入:
static void Main(string[] args)
{
People p = new People() { Age = 13, Name = "Jack" };
Person person = new Person();
// 各プロパティを手動でコピー。プロパティが多いとコードが非常に冗長になる
person.Name = p.Name;
person.Age = p.Age;
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.ReadKey();
}Code language: JavaScript (javascript)
欠点:プロパティが多いほど、代入コードの重複が増える。フィールドを追加・変更する際、すべての代入コードを同期して修正する必要があり、書き漏れによるバグが発生しやすい。
AutoMapper の役割:上記のような
xxx.プロパティ = yyy.プロパティを手動で書く作業を代替し、規約に従って同名プロパティを自動的にコピーする。
AutoMapper とは