(自动映射)具有相同条件冗余的多个映射

时间:2018-04-17 12:31:42

标签: c# .net-core automapper

我需要找到一个更好的解决方案:

public MappingProfile()
    {
        CreateMap<DesireDto, Desire>()
            .ForMember(x => x.CreationDate, x => x.Ignore())
            .ForMember(x => x.ModifiedDate, x => x.Ignore())
            .ForMember(x => x.ModifiedUser, x => x.Ignore())
            .ForMember(x => x.CreationUser, x => x.Ignore())
            .ForMember(x => x.Language, x => x.Ignore());

        CreateMap<ProductDto, Product>()
            .ForMember(x => x.CreationDate, x => x.Ignore())
            .ForMember(x => x.ModifiedDate, x => x.Ignore())
            .ForMember(x => x.ModifiedUser, x => x.Ignore())
            .ForMember(x => x.CreationUser, x => x.Ignore())
            .ForMember(x => x.Language, x => x.Ignore());
    }

我对两者都有相同的条件,但这看起来很丑陋

此线程无效:https://github.com/AutoMapper/AutoMapper/issues/2236

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

var map1 = CreateMap<DesireDto, Desire>();
var map2 = CreateMap<ProductDto, Product>();

foreach (var s in new []{nameof(DesireDto.CreationDate),nameof(DesireDto.ModifiedDate),nameof(DesireDto.ModifiedUser),nameof(DesireDto.CreationUser),nameof(DesireDto.Language)})
{
   map1.ForMember(s,x=>x.Ignore()) ;
   map2.ForMember(s,x=>x.Ignore()) ;
}

但你应该听听Fals关于SRP的建议。

如果DesireDtoProductDto共享某个成员,也许您应该尝试拥有基类或接口,并应用所需的忽略规则。

答案 1 :(得分:0)

您可以在根配置级别使用ForAllPropertyMaps。这允许您筛选类型,名称空间,属性名称,然后忽略:

cfg.ForAllPropertyMaps(pm => 
    pm.DestinationProperty.DeclaredType.Namespace == "Whatever" && 
    pm.DestinationProperty.Name == "CreationDate", 
    (pm, opt) => opt.Ignore());

然后重复您要忽略的所有不同属性。命名空间确保您只对特定命名空间中的类型的目标成员进行过滤,但您可以根据类型元数据执行任何操作。