導入
実務では「DBのエンティティ」を「APIで返すDTO(データ転送用オブジェクト)」に詰め替える、といった似たクラス間のコピーが頻発します。手でdto.Name = user.Name; ...と書くと退屈でミスも起きます。AutoMapperはこの詰め替えを設定に基づき自動化します。
図解
flowchart LR
ENT["User(エンティティ)<br/>Id / Name / PasswordHash"] -->|Map<UserDto>| DTO["UserDto(公開用)<br/>Id / Name"]
CFG["CreateMap<User, UserDto><br/>対応ルール"] -.->|制御| DTO
進め方
- スターター
117-automapper/starter.zipを展開し、AutoMapperLesson.slnを開く(AutoMapper導入済み) Program.csのTODO(マッピング設定とMap呼び出し)を埋める- 期待される出力と照合する
学ぶこと
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は似たクラス間の詰め替えを
CreateMap+Map<T>で自動化する - 同名プロパティは自動対応、差分は
ForMemberで調整する - エンティティ→DTOの変換定番。使いすぎず要所で使う
次回: 入力チェックを宣言的に書くFluentValidationです。
テンプレート構成(教材制作用メモ)
117-automapper/
├── starter.zip # AutoMapper導入済み / Program.cs(TODO入り)
└── solution/Program.cs