использовать пользовательское отображение в обратной карте - PullRequest
0 голосов
/ 04 апреля 2020

Это мой код:

public class PostDto : BaseDto<PostDto, Post>
{
    [JsonIgnore]
    public override int Id { get; set; }

    [Required]
    [StringLength(200)]
    public string Title { get; set; }

    [Required]
    [DataType(DataType.Html)]
    public string Text { get; set; }

    [Required]
    [StringLength(500)]
    [DataType(DataType.Text)]
    public string ShortDescription { get; set; }

    [Required]
    public int TimeToRead { get; set; }

    [Required]
    [DataType(DataType.ImageUrl)]
    public string Image { get; set; }

    [Required]
    public int CategoryId { get; set; }

    [JsonIgnore]
    public DateTimeOffset Time { get; set; }

    [JsonIgnore]
    public int UserId { get; set; }

    public override void CustomMappings(IMappingExpression<Post, PostDto> mappingExpression)
    {
            mappingExpression.ForMember(
               dest => dest.Time,
               config => config.MapFrom(src => DateTimeOffset.Now));

            mappingExpression.ReverseMap().ForMember(
                dest => dest.Time,
                config => config.MapFrom(src => DateTimeOffset.Now));

            mappingExpression
                .ForMember(d => d.Time, opt => opt.MapFrom(src => DateTimeOffset.Now))
                .ReverseMap()
                .ForMember(d => d.Time, opt => opt.MapFrom(src => DateTimeOffset.Now))
                .ForPath(s => s.Time, opt => opt.MapFrom(src => DateTimeOffset.Now));
     }
}

И я получаю dto от контроллера и сопоставляю его с сущностью. Я хочу добавить время при отображении автоматически, но это не сработает.
Если я сопоставлю сущность (post) с dto (postDto), например, чтобы преобразовать дату в строку, это будет работать, но наоборот, это не будет работать

my Controller:

public override Task<ApiResult<PostSelectDto>> Create(PostDto dto, CancellationToken cancellationToken)

Код для преобразования dto в сущность (после того, как время карты в [model] равно нулю или значение по умолчанию datetimeoffset)

var model = dto.ToEntity(Mapper);

Метод ToEntity:

public TEntity ToEntity(IMapper mapper)
{
    return mapper.Map<TEntity>(CastToDerivedClass(mapper, this));
}

1 Ответ

0 голосов
/ 08 апреля 2020

На основе этого URL мы можем добавить код даты и времени, который я отправляю с переопределением
ссылка

Причина в том, что UseValue является stati c, поэтому он устанавливается один раз когда создается экземпляр MapProfile и все последующие вызовы .Map () будут использовать то же самое значение c значение

Поэтому я пишу пользовательскую карту без использования отражения для создания карты для сущностей и dto

public class PostCustomMapping : IHaveCustomMapping
{
    public void CreateMappings(Profile profile)
    {
        profile.CreateMap<Post, PostDto>().ReverseMap()
            .ForMember(dest => dest.Time,
                opt =>
                    opt.MapFrom(src => DateTimeOffset.Now))

            .ForMember(dest => dest.Text,
                opt =>
                    opt.MapFrom(src => src.Text.FixPersianChars()))

            .ForMember(dest => dest.Title,
                opt =>
                    opt.MapFrom(src => src.Title.FixPersianChars()))

            .ForMember(dest => dest.ShortDescription,
                opt =>
                    opt.MapFrom(src => src.ShortDescription.FixPersianChars()));
    }
}
...