AutoMapperの設定と実行をしてみよう

AutoMapperとはなんぞや、というのは、前に書いたので、今度は設定と使用について書いていきましょう。

まずは、設定を行う必要があります。
設定は、ASP.NET MVC(c#)で利用する場合、アプリケーションスタート時に一度、呼び出すだけでOKです。(セッション単位でやるとかだと、超ウザいですものね。)

今回はAutoMapperConfigというクラス内で、マッピングの設定を行うことにします。

と、その前に、入れ替え用のDtoとViewModel、ついでにJsonModelを作成しましょう。

Dto

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メソッドに、マッピング先のオブジェクト型をタイプに設定し、マッピング元のオブジェクトを
第一引数に設定します。
引き渡したオブジェクトが、指定したタイプのオブジェクトに変換され、返却されます。