C# - AutoMapper

기본

  • 객체간의 복사를 자동으로 한다. 복사되는 객체에 복사한다.
  • Nuget으로 설치 가능.
public class SourceType
{
    public int SourceId { get; set; }
    public string Value { get; set; }
    public DateTime DateUpdated { get; set; }
}

public class TargetType
{
    public string Value { get; set; }
    public DateTime DateUpdated { get; set; }
}

Mapper.CreateMap<SourceType, TargetType>();

var source = new SourceType() { SourceId = 1, Value = "value", DateUpdated = DateTime.Today };
    var target = Mapper.Map<TargetType>(source);

객체간의 멤버 이름이 서로 다른 경우

public class SourceType
{
  public int SourceId { get; set; }
  public string Value { get; set; }
  public DateTime DateUpdated { get; set; }
}
 
public class TargetType
{
  public string Value { get; set; }
  public DateTime DateChanged { get; set; }
}

Mapper.CreateMap<SourceType, TargetType>()
      .ForMember(d => d.DateChanged, o => o.MapFrom(s => s.DateUpdated));

var source = new SourceType() { SourceId = 1, Value = "value", DateUpdated = DateTime.Today };
var target = Mapper.Map<TargetType>(source);

여러 소스를 하나의 타켓에 매핑

public class SourceType1
{
  public int SourceId { get; set; }
  public string Value { get; set; }
  public DateTime DateUpdated { get; set; }
}
 
public class SourceType2
{
  public int Rank { get; set; }
}
 
public class TargetType
{
  public string Value { get; set; }
  public DateTime DateChanged { get; set; }
  public int CurrentRank { get; set; }
}

// SourceType1과 SourceType2를 TargetType으로 매핑
Mapper.CreateMap<SourceType1, TargetType>()
      .ForMember(d => d.DateChanged, o => o.MapFrom(s => s.DateUpdated));
 
Mapper.CreateMap<SourceType2, TargetType>()
      .ForMember(d => d.CurrentRank, o => o.MapFrom(s => s.Rank));

var source1 = new SourceType1() { SourceId = 1, Value = "value", DateUpdated = DateTime.Today };
var source2 = new SourceType2() { Rank = 2 };
 
var target = Mapper.Map<TargetType>(source1);
target = Mapper.Map<SourceType2, TargetType>(source2, target);
// 확장 메소드를 사용하면 좀 더 간단
public static TTarget Map<TSource, TTarget>(this TTarget target, TSource source)
{
  var result = Mapper.Map(source, target);
  return result;
} 

var source1 = new SourceType1() { SourceId = 1, Value = "value", DateUpdated = DateTime.Today };
var source2 = new SourceType2() { Rank = 2 };
 
var target = Mapper.Map<TargetType>(source1)
                   .Map(source2);

참고 및 출처

  • AutoMapper 소개
    • http://blog.aliencube.org/ko/2015/03/24/introducing-automapper/
  • (일어)AutoMapper를 사용하여 서로 다은 오브젝트 간에 데이터 복사를 자동화
    • http://www.atmarkit.co.jp/ait/articles/1503/17/news115.html
    • http://www.atmarkit.co.jp/ait/articles/1503/24/news062.html
    • http://www.atmarkit.co.jp/ait/articles/1504/01/news017.html

이 글은 2019-03-01에 작성되었습니다.