使用链接地图/传递映射/链式地图的 AutoMapper 地图

Posted

技术标签:

【中文标题】使用链接地图/传递映射/链式地图的 AutoMapper 地图【英文标题】:AutoMapper map using linked maps / Transitive mapping / Chain maps 【发布时间】:2021-10-10 08:28:00 【问题描述】:

在 C# dotnet 中,如何使用 AutoMapper 创建使用链式映射的映射/使用其他映射到中间类型的映射?

在示例中,存在从类型 A 到类型 B 的映射,也存在从 B 到 C 的映射。 因此,可以使用上述两个创建从 A 到 C 的映射:将它们组合或使用第一个映射到 B 类型的对象,然后使用第二个映射到最终映射,通过路径:A -> B -> C。

在更复杂的场景中,可能会有不止一个路径,因此需要指定一个,但是如何指定?

public class A

    public string TestA  get; set; 


public class B

    public string TestB  get; set; 


public class C

    public string TestC  get; set; 


this.CreateMap<A, B>()
.ForMember(dst => dst.TestB, opts => opts.MapFrom(src => src.TestA));
this.CreateMap<B, C>()
.ForMember(dst => dst.TestC, opts => opts.MapFrom(src => src.TestB));

this.CreateMap<A, C>();// A -> B -> C
// something like .UsingMap<A, B>().ThenUsingMap<B, C>()

我们如何表达这一点?

【问题讨论】:

docs.automapper.org/en/latest/Custom-type-converters.html 我知道我可以使用自定义转换器或转换函数,但重点是编写最少的代码,并且可能还保留映射表达式的能力。 【参考方案1】:

好的,我发现这个问题试图做同样的事情。如果我没记错的话,你有 A->B 和 B->C,你想要 A->C。

为此,我所做的是创建这两张地图,然后我像这样使用ConvertUsing

CreateMap<A, B>();

CreateMap<B, C>();

CreateMap<A, C>()
  .ConvertUsing((entity, c, context) =>
    
      var intermediate = context.Mapper.Map<B>(entity);
      return context.Mapper.Map<C>(intermediate);
    );

它对我有用。我不知道您要查找的内容是否更复杂或有不同的需求/结束,但对我来说这是一个非常简单的地图,但第一个(A-> B)有我不想重复的遗留逻辑在 B->C 中,所以我这样做是为了重用以前的映射。让我知道您的想法以及它是否适合您。

【讨论】:

是的,我最终得到了一个类似的解决方案,如前所述,它适用于对象映射,但不适用于表达式。我搜索了两次文档,但没有找到任何有用的东西。虽然导出映射应该非常简单(在这种情况下),即如果属性 TestA 映射到 TestB (A -> B) 和 TestB 到 TestC (B -> C),那么 TestA 应该映射到 TestC (A -> C)但是人们不能自己实现这种行为,因为在配置时地图是不可访问的。我认为这是一个权衡,如果要映射表达式,则需要编写一些重复的代码。

以上是关于使用链接地图/传递映射/链式地图的 AutoMapper 地图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark Udf 中传递地图?

Vue 3 如何观看地图

在谷歌地图中将当前位置映射到目的地位置

通过传递纬度和经度打开 Apple 地图

如何在 argo 工作流程中的地图中传递多行 json 字符串

使用图片地图减少HTTP请求数量