如何忽略有条件的映射

How to ignore mapping with condition

因为我只有一个 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 的映射如果我们进行更新并且我们可以做条件如果id <= 0, 其余允许映射到 DateCreated.

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

我很感激你 feedback/comment。

这是添加条件的方法。 这就是您要找的吗?

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 => {

        });
    });
});