起動時の呼び出し設定

基本的に、AutoMapperの設定はアプリケーション起動時に一回だけ呼び出せば結構です。そのため、ASP.NETの場合、Global.asaxに次のようなコードを記述しておくとよいでしょう。

Global.asaxのApplication_StartメソッドでAutoMapperを設定

//ASP.NETアプリケーション起動時に呼び出されるメソッド
protected void Application_Start()
{
  (中略)
  //マッパーを初期化
  //Mapper.Reset();
  //マッピング設定を読み込み
  Mapper.AddProfile<BookViewProfile>();
  //マッピング設定の妥当性をチェック
  Mapper.AssertConfigurationIsValid();
}

このコードによって起動時にAutoMapperの初期設定が行われるので、業務ロジックからはMapメソッドだけを呼び出すことができます。

プロファイルによる設定の管理

AddProfileメソッドの引数に指定しているBookViewProfileクラスには、マッピング方法を記述しています。

CreateMapをまとめて定義するProfileクラス

public class BookViewProfile : Profile
{
  protected override string ProfileName
  {
    get { return "BookViewProfile"; }
  }

  protected override void Configure()
  {
    //BookViewのマッピング設定
    CreateMap<Book, BookView>();

    //BookView2のマッピング設定
    CreateMap<Book, BookView2>()
      .ForMember(view => view.PubdateYear,
                 option => option.MapFrom(entity => entity.Pubdate.Year))
      .ForMember(view => view.AuthorAge,option => option.Ignore());
  }
}

BookViewProfileクラスはProfileクラスを継承します。そして、Configureメソッドに初期処理を記述します。ここではBookViewとBookView2に対するマッピング設定を記述しています。

マッピング定義のチェック

AutoMapperにはマッピング定義をチェックする「AssertConfigurationIsValid」メソッドも用意されています。もし設定が間違っている場合には、そのプロパティ名が表示されます。

妥当性チェック(BookView3にPubdateYmdの設定が無い場合のエラー)

(補足)日本語のクラス名とプロパティ名

AutoMapperはアルファベットの大文字を使ってクラスとプロパティを識別しています。そのため日本語クラス名、メンバ名をうまく動作しません。リポジトリのソースコードを取得して筆者が試したところ、INamingConvention.csにあるPascalCaseNamingConventionクラスの正規表現を「[\p{L}0-9]+(?=?)」のように書き換えて、SeparatorCharacterプロパティを「」に変更すれば「著者_年齢」のようなプロパティ名で詰め替えできることは確認できました。もっと良い方法があるかもしれませんが、参考まで紹介しておきます。

最後に

本稿ではAutoMapperの概要について解説してきました。興味をもたれた方は、AutoMapperをダウンロードしてみてはいかがでしょうか。ソースコードリポジトリにあるUnitTestやSampleにも面白いサンプルが用意されています。