我正在使用 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; }
}
自动映射器配置:
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));
我是自动映射器的新手,但这似乎工作正常。
我的问题是,是否有更清晰或更简洁的方法来定义所需的映射?
最佳答案
在 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)));
关于c# - Automapper嵌套实体配置最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72493867/