Skip to content

MS_AutoMapper

nishi_74322014 edited this page Aug 18, 2026 · 1 revision

AutoMapper

概要

AutoMapper について。

  • .NET Standard 対応もされている。
  • 評価後の感想は、少々微妙だった(ので自作した)。

補足(用途): AutoMapper は
**オブジェクト間の詰め替え(Object-Object Mapping)**を規約ベースで自動化する
ライブラリで、DB アクセスそのものを行うものではない。

典型的な用途は、

  • エンティティ(Entity Framework)→ DTO / ViewModel
  • 入力モデル → ドメイン モデル

といった層をまたぐ変換である。
データアクセスのカテゴリに置かれているのは、
IDataReader からのマッピング(後述)を扱っているためである。

詳細

Object to Object

補足(最新化:静的 Mapper は廃止): 参考リンクにある
CreateMap が使えない」は、AutoMapper 4.2 以降で
静的 API(Mapper.CreateMap / Mapper.Initialize)が非推奨・削除された
ことによる。
現在はインスタンス API(MapperConfiguration / IMapper)を使う。

// Profile に定義をまとめる
public class BlogProfile : Profile
{
    public BlogProfile()
    {
        CreateMap<Blog, BlogDto>()
            .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name));
    }
}

// ASP.NET Core:DI に登録(AutoMapper.Extensions.Microsoft.DependencyInjection)
builder.Services.AddAutoMapper(typeof(BlogProfile).Assembly);

// 利用側
public class BlogService(IMapper mapper) { /* mapper.Map<BlogDto>(blog) */ }

スレッド安全性については、
MapperConfiguration / IMapper はスレッド セーフで、
シングルトンとして共有してよい(構成の生成はコストが高いので使い回す)。

補足(ライセンスの変更): AutoMapper は
2025 年に商用ライセンスへ移行した(作者の発表による)。
一定規模以下の利用は無償枠があるものの、
新規採用時はライセンス条件の確認が必須である。
元ページの「自作した」という判断は、結果的にこの変更の影響を受けない。

代替としては、

  • 手書きのマッピング メソッド(最も確実。生成 AI や IDE の支援で負担も小さい)
  • Mapperly(ソース ジェネレータ。実行時リフレクションが無く高速)
  • Mapster

などが挙げられる。

Collection Extensions

オブジェクト・コレクションからオブジェクト・コレクションへのマッピング。

IDataReader/Record Extensions

AutoMapper.Data は、色々と調べてみたが上手く動かない。

したほうが良さそう。

※ 汎用ライブラリの割に★や DL 数が少ない。

補足: IDataReader から POCO への詰め替えが目的なら、
それ専門である Dapperを使うのが素直である。
AutoMapper は本来「オブジェクト同士の変換」のためのライブラリであり、
データ リーダからのマッピングは主戦場ではない。

EF6 Extensions

Entity Framework 6 用の拡張の AutoMapper.EF6 というものがある。

※ 汎用ライブラリの割に★や DL 数が少ない(AutoMapper.Data よりは多い)。

補足(射影は ProjectTo を使う): EF と組み合わせる場合、
エンティティを全件取得してから Map するのではなく、
ProjectTo<TDto>() を使うと SELECT 句が DTO の列だけに絞られる。

var dtos = await context.Blogs
    .Where(b => b.IsPublic)
    .ProjectTo<BlogDto>(mapper.ConfigurationProvider)
    .ToListAsync();

不要な列や関連の読み込みを避けられるため、性能差が大きい。

Microsoft DI Extensions

ASP.NET Core の DI 用の拡張。

参考

NuGet Gallery

.NET TIPS - @IT

備忘録

Stack Overflow


Tags: 移行, データアクセス, .NET開発, ADO.NET

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally