Как игнорировать отображение с условием - PullRequest
0 голосов
/ 19 сентября 2019

Поскольку у меня один DTO, мы используем DTO для GET, PUT и POST http-методов в нашем веб-API.

Для простоты у нас есть 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));
        });

Я хочу IGNORE отображение DateCreated , если мы сделаем обновление, и мы можем выполнить условие, если id <= 0, остальное разрешеносопоставление для DateCreated.

Возможно ли это?Скорее бы иметь отдельные DTO между GET / POST (Add) VS PUT (Update)?Есть ли лучшее решение для обработки этой DateCreated VS DateModified вещь?

Я ценю ваши отзывы / комментарии.

1 Ответ

1 голос
/ 19 сентября 2019

Это способ добавления условий.Это то, что вы ищете?

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's PreCondition

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

        });
    });
});
...