本篇AutoMapper使用場景:
※ 型別轉換,源string型別分別轉換成int, DateTime,Type
※ 源和目標都包含複雜型別屬性
※ 把源中的一個屬性對映到目標中的多個屬性
型別轉換,源string型別分別轉換成int, DateTime,Type
□ Domain model
public class Source2
{
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
}
□ View model
public class Destination2
{
public int Value1 { get; set; }
public DateTime Value2 { get; set; }
public Type Value3 { get; set; }
}
□ 派生TypeConverter<,>自定義轉換
//string轉換成DateTime型別
public class DateTimeTypeConverter : TypeConverter<string,DateTime>
{
protected override DateTime ConvertCore(string source)
{
return System.Convert.ToDateTime(source);
}
}
//string轉換成Type型別
//當然,這裡的string必須是當前專案下的某個類
public class TypeTypeConverter : TypeConverter<string, Type>
{
protected override Type ConvertCore(string source)
{
Type type = Assembly.GetExecutingAssembly().GetType(source);
return type;
}
}
□ 對映配置
Mapper.CreateMap<string, int>().ConvertUsing(Convert.ToInt32);
Mapper.CreateMap<string, DateTime>().ConvertUsing<DateTimeTypeConverter>();
Mapper.CreateMap<string,Type>().ConvertUsing<TypeTypeConverter>();
Mapper.CreateMap<Source2, Destination2>();
□ 要點
型別轉換用Convertusing<>()方法
源和目標都包含複雜型別屬性
□ Domain model
public class OuterSource
{
public int Value { get; set; }
public InnerSource Inner { get; set; }
}
public class InnerSource
{
public int OtherValue { get; set; }
}
□ View model
public class OuterDest
{
public int Value { get; set; }
public InnerDest Inner { get; set; }
}
public class InnerDest
{
public int OtherValue { get; set; }
}
□ 對映配置
Mapper.CreateMap<OuterSource, OuterDest>();
Mapper.CreateMap<InnerSource, InnerDest>();
□ 使用
public ActionResult Nest()
{
var source = new OuterSource()
{
Value = 5,
Inner = new InnerSource(){OtherValue = 15}
};
var dest = Mapper.Map<OuterSource, OuterDest>(source);
return View(dest);
}
□ 要點
當源和目標都具有複雜屬性並對應,複雜屬性對應的類也需要配置對映。
把源中的一個屬性對映到目標中的多個屬性
□ Domain model
public class CalendarEvent
{
public DateTime EventDate { get; set; }
public string Title { get; set; }
}
public class CalendarEventForm
{
public DateTime EventDate { get; set; }
public int EventHour { get; set; }
public int EventMinute { get; set; }
public string Title { get; set; }
}
□ 自定義解析器
//轉換成DateTime.Date
public class DateTimeToDateResolver : ValueResolver<CalendarEvent, DateTime>
{
protected override DateTime ResolveCore(CalendarEvent source)
{
return source.EventDate.Date;
}
}
//轉換成DateTime.Hour
public class DateTimeToHourResolver : ValueResolver<CalendarEvent, int>
{
protected override int ResolveCore(CalendarEvent source)
{
return source.EventDate.Hour;
}
}
//轉換成DateTime.Minute
public class DateTimeToMinuteResolver : ValueResolver<CalendarEvent, int>
{
protected override int ResolveCore(CalendarEvent source)
{
return source.EventDate.Minute;
}
}
□ 對映配置
Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
.ForMember("EventDate", opt => opt.ResolveUsing<DateTimeToDateResolver>())
.ForMember("EventHour", opt => opt.ResolveUsing<DateTimeToHourResolver>())
.ForMember("EventMinute", opt => opt.ResolveUsing<DateTimeToHourResolver>());
□ 使用
public ActionResult Projection()
{
var calendarEvent = new CalendarEvent
{
EventDate = new DateTime(2008, 12, 15, 20, 30, 0),
Title = "Company Holiday Party"
};
CalendarEventForm from = Mapper.Map<CalendarEvent, CalendarEventForm>(calendarEvent);
return View(from);
}