我有这个代码:
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
(示例)的值
替代方法是创建映射方法并“手动”映射它
- 无需配置
- 支持所有可能的逻辑和转换
- 易于阅读
- 适合不同专业水平的开发者理解
- 编译时类型检查
- 测试时不需要模拟
public static TechDataVariant MapVariantData(TechData source)
{
return new TechDataVariant
{
// add mapping logic here
};
}
// Usage
var variant = MapVariantData(src.TechDataVariant);