如何忽略条件映射

时间:2019-09-19 06:04:24

标签: asp.net asp.net-web-api automapper

由于我只有一个DTO,因此我们在Web API中将DTO用于GET,PUT和POST http方法。

为简单起见,我们有ActivityDO:

public ActivityDTO
{
   public int Id;
   public string Name;
   public string CategoryName;
   public DateTime DateCreated;
   public DateTime DateModified;
}

挑战在于,当您只有一个DTO来处理多种条件(即post / get / put方法)时,映射如下:

private MapperConfiguration configuration = new MapperConfiguration(cfg => {
            cfg.CreateMap<ActivityDTO, Activity>()
                .ForMember(dst => dst.UserId, opt => opt.MapFrom(src => HttpContext.Current.User.Identity.GetUserId()))
                .ForMember(dst => dst.CategoryId, opt => opt.MapFrom(src => GetCategoryId(HttpContext.Current.User.Identity.GetUserId(), src.CategoryName)))
                .ForMember(dst => dst.DateCreated, opt => opt.MapFrom(src => DateTime.UtcNow))
                .ForMember(dst => dst.DateModified, opt => opt.MapFrom(src => DateTime.UtcNow));
        });

如果要进行更新,我想为 DateCreated 进行 IGNORE 映射,并且如果id <= 0,我们可以做条件,其余的映射用于DateCreated。

这可能吗?宁愿在GET / POST(添加)VS PUT(更新)之间使用单独的DTO?有什么更好的解决方案来处理DateCreated VS DateModified吗?

感谢您的反馈/意见。

1 个答案:

答案 0 :(得分:1)

这是添加条件的方法。 那是您要找的东西吗?

private MapperConfiguration configuration = new MapperConfiguration(cfg => {
    cfg.CreateMap<ActivityDTO, Activity>()
        .ForMember(dst => dst.UserId, opt => opt.MapFrom(src => HttpContext.Current.User.Identity.GetUserId()))
        .ForMember(dst => dst.CategoryId, opt => opt.MapFrom(src => GetCategoryId(HttpContext.Current.User.Identity.GetUserId(), src.CategoryName)))
        .ForMember(dst => dst.DateCreated, opt => opt.MapFrom(src => src.Condition(src.DateCreated != null)))
        .ForMember(dst => dst.DateModified, opt => opt.MapFrom(src => DateTime.UtcNow));
        });

我使用了src.DateCreated != null,但是您可以使用src.Condition()指定任何条件,并且只有在满足条件时才会映射变量。

您可以使用AutoMapper的PreCondition

var configuration = new MapperConfiguration(cfg => {
cfg.CreateMap<Foo,Bar>()
    .ForMember(dest => dest.baz, opt => {
        opt.PreCondition(src => (src.baz >= 0));
        opt.MapFrom(src => {

        });
    });
});