【问题标题】:use custom mapping in reverse map在反向映射中使用自定义映射
【发布时间】:2020-04-04 14:10:57
【问题描述】:

这是我的代码:

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,并将其映射到实体。我想在自动映射时添加时间,但它不起作用。
如果我从 entity(post) 映射到 dto(postDto) 例如将日期转换为字符串,它可以工作,但反过来它就不行了

我的控制器:

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

将 dto 转换为实体的代码(在 [model] 中的映射时间为 null 或 datetimeoffset 的默认值之后)

var model = dto.ToEntity(Mapper);

ToEntity 方法:

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

【问题讨论】:

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


【解决方案1】:

基于此 url,我们可以添加日期时间,例如我使用覆盖发送的代码
link

原因是,UseValue 是一个静态值,所以它在 MapProfile 实例化时设置一次,所有后续的 .Map() 调用都将使用相同的静态值

所以我编写自定义地图而不使用反射来为实体和 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()));
    }
}

【讨论】:

  • 关于FixPersianChars,检查值转换器。您不必在任何地方都指定它:)
  • @LucianBargaoanu 我只在从用户那里获得该值时检查,例如在创建新帖子时
  • 你总是可以建立一些规则然后使用它。无需手动操作。
  • @LucianBargaoanu 谢谢,你能给我举个例子吗?
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 2019-01-25
  • 1970-01-01
  • 2013-11-29
  • 2015-10-20
  • 1970-01-01
  • 2017-02-17
  • 2013-09-24
相关资源
最近更新 更多