AutoMapperの設定と実行をしてみよう
AutoMapperとはなんぞや、というのは、前に書いたので、今度は設定と使用について書いていきましょう。
まずは、設定を行う必要があります。
設定は、ASP.NET MVC(c#)で利用する場合、アプリケーションスタート時に一度、呼び出すだけでOKです。(セッション単位でやるとかだと、超ウザいですものね。)
今回はAutoMapperConfigというクラス内で、マッピングの設定を行うことにします。
と、その前に、入れ替え用のDtoとViewModel、ついでにJsonModelを作成しましょう。
namespace CreatioVitae.Models.Retrospects.Dto { public class RetrospectSummary { /// <summary> /// Id /// </summary> public int Id { get; set; } /// <summary> /// 業種 /// </summary> public string Industry {get;set;} /// <summary> /// 役割 /// </summary> public string Role {get;set;} /// <summary> /// プロジェクト名 /// </summary> public string ProjectName { get; set; } /// <summary> /// プロジェクト期間From /// </summary> public DateTime ProjectTermFrom { get; set; } /// <summary> /// プロジェクト期間To /// </summary> public DateTime ProjectTermEnd { get; set; } /// <summary> /// プロジェクトサマリー /// </summary> public string ProjectSummary { get; set; } } }
ViewModel
namespace CreatioVitae.ViewModels.Retrospects { public class RetrospectSummaryViewModel { /// <summary> /// Id /// </summary> public int Id { get; set; } /// <summary> /// 業種 /// </summary> public string Industry { get; set; } /// <summary> /// 役割 /// </summary> public string Role { get; set; } /// <summary> /// プロジェクト名 /// </summary> public string ProjectName { get; set; } /// <summary> /// プロジェクト期間From /// </summary> public DateTime ProjectTermFrom { get; set; } /// <summary> /// プロジェクト期間To /// </summary> public DateTime ProjectTermEnd { get; set; } /// <summary> /// プロジェクトサマリー /// </summary> public string ProjectSummary { get; set; } } }
JsonModel
namespace CreatioVitae.JsonModels.Retrospects { public class retrospect_summary { /// <summary> /// Id /// </summary> public int id { get; set; } /// <summary> /// 業種 /// </summary> public string industry { get; set; } /// <summary> /// 役割 /// </summary> public string role { get; set; } /// <summary> /// プロジェクト名 /// </summary> public string project_name { get; set; } /// <summary> /// プロジェクト期間From /// </summary> public string project_term_from { get; set; } /// <summary> /// プロジェクト期間To /// </summary> public string project_term_end { get; set; } /// <summary> /// プロジェクトサマリー /// </summary> public string project_summary { get; set; } } }
次に、マッピング設定を記述します。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using AutoMapper; using CreatioVitae.Models.Retrospects; using CreatioVitae.JsonModels.Retrospects; using CreatioVitae.ViewModels.Retrospects; using CreatioVitae.Core.Extends; namespace CreatioVitae { public class AutoMapperConfig { public static void RegisterCreateMap() { //RetrospectSummary To RetrospectSummaryViewModel Mapper.CreateMap<RetrospectSummary, RetrospectSummaryViewModel>(); //RetrospectSummaryViewModel To RetrospectSummary Mapper.CreateMap<RetrospectSummaryViewModel, RetrospectSummary>(); //retrospect_summary To RetrospectSummary Mapper.CreateMap<retrospect_summary,RetrospectSummary>() .ForMember(m => m.Id, retrospectSummary => retrospectSummary.MapFrom(s => s.id)) .ForMember(m => m.Industry, retrospectSummary => retrospectSummary.MapFrom(s => s.industry)) .ForMember(m => m.ProjectName, retrospectSummary => retrospectSummary.MapFrom(s => s.project_name)) .ForMember(m => m.ProjectSummary, retrospectSummary => retrospectSummary.MapFrom(s => s.project_summary)) .ForMember(m => m.ProjectTermFrom, retrospectSummary => retrospectSummary.MapFrom(s => s.project_term_from.ToDateTime())) .ForMember(m => m.ProjectTermEnd, retrospectSummary => retrospectSummary.MapFrom(s => s.project_term_end.ToDateTime())) .ForMember(m => m.Role, retrospectSummary => retrospectSummary.MapFrom(s => s.role)) ; } } }
DtoとViewModelのマッピング設定は相互に設定しています。(シンプルにDto → ViewModelのパターンとViewModel → Dtoのパターンを定義するだけです。)
上記の場合、各オブジェクト内の型も名前も同じなので、オブジェクトを指定するだけでマッピング設定は完了ですが、
JsonModel → Dtoについてはオブジェクト間で、プロパティの命名や型が異なるため、プロパティについてもマッピング設定が必要になります。
プロパティの型ギャップについては、上記は拡張メソッドを作成して解決しています。
次に、呼び出し方です。
var retrospectSummary= new RetrospectSummary() { Id = 1, Industry = "メディア", Role = "Application Developer", ProjectName = "自社サービス研究開発", ProjectTermFrom = new DateTime(2010,1,1), ProjectTermEnd = new DateTime(2011,12,31), ProjectSummary = "自社サービス開発研究の技術責任者として参画" }; var retrospectSummaryViewModel = Mapper.Map<RetrospectSummaryViewModel>(retrospectSummary);
Mapメソッドに、マッピング先のオブジェクト型をタイプに設定し、マッピング元のオブジェクトを
第一引数に設定します。
引き渡したオブジェクトが、指定したタイプのオブジェクトに変換され、返却されます。