首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Automapper嵌套实体配置最佳实践

Automapper嵌套实体配置最佳实践
EN

Stack Overflow用户
提问于 2022-06-03 18:38:33
回答 1查看 149关注 0票数 2

我使用Automapper将一些嵌套的EF类压缩到包含所有相关属性的DTO中,并使用字典进行本地化查找。参见下面的示例代码。

实体类:

代码语言:javascript
运行
复制
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级:

代码语言:javascript
运行
复制
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配置:

代码语言:javascript
运行
复制
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));

我刚开始使用自动驾驶,但这似乎是正确的。

我的问题是,是否有一种更清晰或更简洁的方法来定义所需的映射?

EN

Stack Overflow用户

回答已采纳

发布于 2022-06-04 02:24:49

当然,在AutoMapper中有多种方法可以完成相同的任务。这里有几个更简洁的选项,可以更直接地处理DbDetails.Resources

代码语言:javascript
运行
复制
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的上下文中使用它),则可以将配置缩短为:

代码语言:javascript
运行
复制
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)));
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72493867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档