本文へスキップ
BecomeCoder

C#実践コース · 第6章 代表的なNuGetパッケージとその使い方 · レッスン33

AutoMapper ― オブジェクト間の変換を自動化(ローカル実施)

ローカル実施

導入

実務では「DBのエンティティ」を「APIで返すDTO(データ転送用オブジェクト)」に詰め替える、といった似たクラス間のコピーが頻発します。手でdto.Name = user.Name; ...と書くと退屈でミスも起きます。AutoMapperはこの詰め替えを設定に基づき自動化します。

図解

flowchart LR
    ENT["User(エンティティ)<br/>Id / Name / PasswordHash"] -->|Map&lt;UserDto&gt;| DTO["UserDto(公開用)<br/>Id / Name"]
    CFG["CreateMap&lt;User, UserDto&gt;<br/>対応ルール"] -.->|制御| DTO

進め方

  1. スターター117-automapper/starter.zipを展開し、AutoMapperLesson.slnを開く(AutoMapper導入済み)
  2. Program.csのTODO(マッピング設定とMap呼び出し)を埋める
  3. 期待される出力と照合する
Visual StudioでAutoMapperを実行し、UserエンティティからUserDtoへ自動変換された結果が表示された様子
同名プロパティは自動で対応づき、余計なフィールドは運ばれない

学ぶこと

using AutoMapper;

// 1) どのクラスからどのクラスへ変換するかを設定する
var config = new MapperConfiguration(cfg => cfg.CreateMap<User, UserDto>());
IMapper mapper = config.CreateMapper();

// 2) 変換する。同じ名前のプロパティは自動でコピーされる
var user = new User(1, "Taro", "secret-hash");
UserDto dto = mapper.Map<UserDto>(user);
Console.WriteLine($"{dto.Id}: {dto.Name}");   // PasswordHash は DTO に無いので運ばれない

record User(int Id, string Name, string PasswordHash);
record UserDto(int Id, string Name);
  • CreateMap<変換元, 変換先>()で対応を宣言し、Map<T>()で実際に詰め替える
  • 同名プロパティは自動対応。名前が違う場合はForMemberで個別に指定できる
  • DTOに存在しないプロパティ(パスワード等)は運ばれない=公開したくない情報を落とせる
  • 実務ではDIコンテナIMapperを登録して使う。小さなクラスなら手書きコピーの方が明快なこともある(使いどころを見極める)

期待される出力

1: Taro

まとめ

  • AutoMapperは似たクラス間の詰め替えをCreateMapMap<T>で自動化する
  • 同名プロパティは自動対応、差分はForMemberで調整する
  • エンティティ→DTOの変換定番。使いすぎず要所で使う

次回: 入力チェックを宣言的に書くFluentValidationです。

テンプレート構成(教材制作用メモ)

117-automapper/
├── starter.zip   # AutoMapper導入済み / Program.cs(TODO入り)
└── solution/Program.cs