如何确保在 AutoMapper 中忽略成员不会将值设置为 null?

问题描述 投票:0回答:1

我有这个代码:

var variants = CreateMap<TechDataVariant, TechData>();
variants.ForAllMembers(opt => opt.Ignore());
variants.ForPath(dest => dest.Acceleration.Label, opt => opt.MapFrom(source => source.Acceleration.Label))
        .ForPath(dest => dest.Acceleration.Value, opt => opt.MapFrom(source => source.Acceleration.Value))

我首先忽略所有道具,然后映射它们。

我对 3 个对象执行此操作,其中我有 3 个 Techdata 来源,因此它可能如下所示:

var other1 = CreateMap<Other1, TechData>();
other1.ForAllMembers(opt => opt.Ignore());

other1.ForPath(dest => dest.Other1.Label, opt => opt.MapFrom(source => source.SomethingElse1.Label))
        .ForPath(dest => dest.Other1.Value, opt => opt.MapFrom(source => source.SomethingElse2.Value))

第三个:

var other2 = CreateMap<Other2, TechData>();
other2.ForAllMembers(opt => opt.Ignore());

other2.ForPath(dest => dest.Other2.Label, opt => opt.MapFrom(source => source.SomethingElse2.Label))
        .ForPath(dest => dest.Other2.Value, opt => opt.MapFrom(source => source.SomethingElse2.Value))

然后我有一个对象和一个 dto,我可以在其中映射它们并使用

AfterMap
:

CreateMap<MyDTO, MyTarget>()
           .ForMember...some props

           .AfterMap((src, dest, context) =>
             {
                 if (dest.TechData == null)
                     dest.TechData = new TechData();

                 // Map the individual source types to TechData using context.Mapper.Map
                 var variant = context.Mapper.Map<TechData>(src.TechDataVariant);
                 var other1 = context.Mapper.Map<TechData>(src.other1);
                 var other2 = context.Mapper.Map<TechData>(src.other2);

                 // set values on dest target
             });

问题

AfterMap
上,我可以看到
src.TechDataVariant
有值。但一旦完成:

var variant = context.Mapper.Map<TechData>(src.TechDataVariant);

variant
中的所有值都是
null

我发现这是因为

variants.ForAllMembers(opt => opt.Ignore());

但是我该如何解决这个问题?

手动映射有效,但问题是,对于每个映射对象,我需要多次手动为相同字段编写忽略,或者在一种情况下我会使用 2 但忽略 20,在另一种情况下,这将是另一种方式,在第三种情况下从维护和代码质量的角度来看,这成为一个问题。这是因为我对同一目标有多个来源。

我怎样才能以良好的方式实现这一目标?

编辑:

澄清为什么这对我来说是一个问题:

如果我这样做:

.ForPath(dest => dest.MyPop, opt => opt.Ignore())

我为其中一个映射执行此操作,但在另一个映射中我映射它。

想象一下这个场景,但在我的例子中,我有 3 个映射和 20 个字段。

在映射第一个字段时,我映射了 15 个字段并忽略了 5 个字段。 在映射 2 中,我映射 2 个字段并忽略 18。

在地图 3 中,我映射 5 并忽略 15。

现在请注意,所有映射中被忽略的字段并不相同。 这就是为什么“IgnoreAllUnMapped”成为必要的功能。我想做的最重要的是即使在我运行“忽略”之后也保持

src.techDataVariant
(示例)的值

c# .net automapper
1个回答
0
投票

替代方法是创建映射方法并“手动”映射它

  • 无需配置
  • 支持所有可能的逻辑和转换
  • 易于阅读
  • 适合不同专业水平的开发者理解
  • 编译时类型检查
  • 测试时不需要模拟
public static TechDataVariant MapVariantData(TechData source)
{
    return new TechDataVariant 
    {
        // add mapping logic here
    };
}

// Usage
var variant = MapVariantData(src.TechDataVariant);
© www.soinside.com 2019 - 2024. All rights reserved.