我使用Automapper将一些嵌套的EF类压缩到包含所有相关属性的DTO中,并使用字典进行本地化查找。参见下面的示例代码。
实体类:
public class DbClass
{
  public int PropA { get; set; }
  
  public DbDetails Details { get; set; }
}
public class DbDetails
{
  public int PropB { get; set; }
  public ICollection<DbResource> Resources { get; set; }
}
public class DbResource
{
  public string Language { get; set; }
  public string DisplayText { get; set; }
}DTO级:
public class DTO
{
  public int PropA { get; set; }
  public int PropB { get; set; }
  /// Lookup by language code
  public IDictionary<string, string> DisplayText { get; set; }
}Automapper配置:
CreateMap<DbClass, DTO>().IncludeMembers(c => c.Details);
CreateMap<DbDetails, DTO>().IncludeMembers(d => d.Resources);
CreateMap<ICollection<DbResource>, IDictionary<string, string>>()
    .ConstructUsing(src => src.ToDictionary(r => r.Language, r => r.DisplayText));
CreateMap<ICollection<DbResource>, DTO>()
    .ForMember(dest => dest.DisplayText, opts => opts.MapFrom(src => src));我刚开始使用自动驾驶,但这似乎是正确的。
我的问题是,是否有一种更清晰或更简洁的方法来定义所需的映射?
发布于 2022-06-04 02:24:49
当然,在AutoMapper中有多种方法可以完成相同的任务。这里有几个更简洁的选项,可以更直接地处理DbDetails.Resources。
CreateMap<DbClass, DTO>()
    .IncludeMembers(dest => dest.Details);
CreateMap<DbDetails, DTO>()
    .ForMember(dest => dest.DisplayText, opt => opt.MapFrom(src => src.Resources));
CreateMap<ICollection<DbResource>, IDictionary<string, string>>()
    .ConstructUsing(src => src.ToDictionary(r => r.Language, r => r.DisplayText));如果不需要重用上面的最后一个映射(即只在映射DbDetails -> DTO的上下文中使用它),则可以将配置缩短为:
CreateMap<DbClass, DTO>()
    .IncludeMembers(dest => dest.Details);
CreateMap<DbDetails, DTO>()
    .ForMember(dest => dest.DisplayText, 
        opt => opt.MapFrom(src => src.Resources.ToDictionary(r => r.Language, r => r.DisplayText)));https://stackoverflow.com/questions/72493867
复制相似问题