使用日期时间和布尔值自动映射器来表示POCO中的半天

问题描述

|| 假设我有一个POCO,其中存储的日期范围如下:
public class Daterange()
{
public DateTime FromDate{get;set;}
public DateTime ToDate{get;set;}
}
我希望能够在该范围的开始和/或结束时节省半天。为此,我将使用数据作为jqueryui日期选择器显示起始日期和日期,以及每个日期选择器旁边的复选框以表示1/2天。我的视图模型看起来像这样:
public class DaterangeModel()
{
public DateTime FromDate {get; set;}
public DateTime ToDate{get;set;}
public bool IsFromDateHalfDay{get; set;}
public bool IsToDateHalfDay {get; set;}
}
当选中1/2天复选框的FromDate时,我需要将FromDate保存在实体中作为选定的天+ 12小时;当viewmodel中的ToDate选中1/2天的复选框时,我需要保存ToDate在实体中为所选日期+ 12小时。 是否可以使用Automapper做到这一点?如果不能,您是否可以建议更好/不同的方法?我不想在实体中代表半天的布尔值,因为我想单独使用DateTimes进行计算。 一些示例(仍在考虑如何代表1天和1/2天的范围-需要大量测试计算范围!):
A Date Range of 1/2 Day From 24th May to a full day 27th May:
2011-05-24 12:00:00.000 => 2011-05-28 00:00:00.000

A Date Range of Full Day From 24th May to a 1/2 day 27th May:
2011-05-24 00:00:00.000 => 2011-05-27 12:00:00.000

A Half Day on 24th May:
2011-05-24 12:00:00.000 => 2011-05-25 00:00:00.000     

A Full Day on 24th May:
2011-05-24 12:00:00.000 > 2011-05-25 00:00:00.000
    

解决方法

        我们是否假设FromDate / ToDate只能是整天(12:00 AM)或半天(12:00 PM)? 要查看的域(如果需要):
CreateMap<DateRange,DateRangeModel>()
    .ForMember(dest => dest.IsFromDateHalfDay,opts => opts.MapFrom(src=>src.FromDate.Hour == 12))
    .ForMember(dest => dest.IsToDateHalfDay,opts => opts.MapFrom(src=>src.ToDate.Hour == 12));
查看网域
CreateMap<DateRangeModel,DateRange>()
    .ForMember(dest => dest.FromDate,opts => opts.MapFrom(src=>src.FromDate.AddHours(-1 * src.IsFromDateHalfDay ? 12 : 0))
    .ForMember(dest => dest.ToDate,opts => opts.MapFrom(src=>src.ToDate.AddHours(src.IsToDateHalfDay ? 12 : 0));
    ,        吉米·博加德(Jimmy Bogard)谈论在这里做类似的事情:http://lostechies.com/jimmybogard/2009/05/06/automapper-feature-custom-type-converters/ 原理是您将创建一个自定义映射。在映射时,您会考虑两个布尔值,但是它们不会出现在目标类型中。