最近はモデルの詰め直しをする時に AutoMapper を使うようになりました。
MvcFutures には ModelCopier というコピー専門のクラスがあったりしますが、やはり自由度が低すぎるので AutoMapper が便利だと思います。インストールも NuGet から一発です。
Install-Package AutoMapper
基本的な使い方は予め Mapper.CreateMap メソッドでマッピングを作成して、Mapper.Map メソッドで実際にマッピングを行います。
// マッピングを作成 Mapper.CreateMap<Source, Destination>(); // マッピングを実行 var destination = Mapper.Map<Destination>(source);
ちなみに Mapper.CreateMap は最初に 1 回だけ呼べばいいので、ASP.NET アプリの場合は Global.asax の Application_Start でまとめて呼び出したり、PreApplicationStartMethod を使って初期化するのが便利だと思います。
以下はちょっとした Tips 集です。
値をコピーする
Mapper.Map メソッドは新しくオブジェクトを作成する以外にも、既存のオブジェクトを引数で指定することでコピーも可能になってます。
// source から destination へコピーする
Mapper.Map(source, destination);
Entity Framework や LightSpeed のモデルに対して更新を行う時に便利そうです。
マッピング元を指定する
AutoMapper では基本的に同名のプロパティがマッピングされますが、別名のプロパティからマッピングさせることが可能です。
// Source#OtherValue から Destination#Value へのマッピングを指定
Mapper.CreateMap<Source, Destination>()
.ForMember(dst => dst.Value, opt => opt.MapFrom(src => src.OtherValue));
自動生成されたモデルでプロパティの命名規約が微妙に違う時とかに便利です。
固定値のマッピング
特定のプロパティに常に決まった値をセットしたいときには Using を使います。
// Destination#Value へは常に 10 をセット Mapper.CreateMap<Source, Destination>() .ForMember(dst => dst.Value, opt => opt.Using(10));
マッピング元に無いプロパティに値を入れる場合に凄く便利な感じです。