投影(Projection)

投影是将源转换为目标,而不是展平对象模型。
如果没有额外配置,AutoMapper 需要一个经过展平的目标对象,用来匹配源类型的命名结构。
如果需要把源值投影到和源结构不完全匹配的目标对象上,就必须指定自定义成员映射定义。

举个例子,我们有如下源结构:

public class CalendarEvent
{
    public DateTime Date { 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; }
}Code language: JavaScript (javascript)

目标属性名称与源属性并不完全匹配(CalendarEvent.Date 需要映射到 CalendarEventForm.EventDate),因此我们要在类型映射配置里编写自定义成员映射:

// 构造源实体
var calendarEvent = new CalendarEvent
{
    Date = new DateTime(2008, 12, 15, 20, 30, 0),
    Title = "Company Holiday Party"
};

// 配置 AutoMapper
Mapper.Initialize(cfg =>
    cfg.CreateMap<CalendarEvent, CalendarEventForm>()
        .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))
        .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))
        .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute)));

// 执行映射转换
CalendarEventForm form = Mapper.Map<CalendarEvent, CalendarEventForm>(calendarEvent);

form.EventDate.Equals(new DateTime(2008, 12, 15));
form.EventHour.Equals(20);
form.EventMinute.Equals(30);
form.Title.Equals("Company Holiday Party");Code language: JavaScript (javascript)

每一处自定义成员配置,都使用操作委托来配置独立的成员。
上面示例中,使用 MapFrom 选项实现源到目标成员的自定义映射。
MapFrom 接收 lambda 表达式作为参数,映射执行阶段才会对该表达式求值。
MapFrom 的参数可以是任意 lambda 表达式,签名为 Func<TSource, object>

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注