jk's notes
  • 扁平化 Flattening

扁平化 Flattening

即将一个复杂的数据类型映射到一个简单的数据类型上. 例如:

image-20240102103309294

默认 AutoMapper 会将目标类型的成员与源类型成员进行匹配, 如果在源类型中不存在目标类型对应的属性, 包括带有前缀 Get 的对应属性, AutoMapper 会尝试将目标类型的属性名进行分隔, 使用 PascalCase 命名规则分割, 再去源类型中查找.

上述类型中只要配置:

var configuration = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());

在上述案例中:

  • 目标类型需要 Total 属性, 那么就会在源类型中查找 Total, GetTotal 等.
  • 目标类型需要 CustomerName 属性, 而源类型中没有该属性, 就会将其拆分为 Customer.Name 来进行查找.

如果需要禁用该模式, 可以使用 ExactMatchNamingConvention:

cfg.DestinationMemberNamingConvention = new ExactMatchNamingConvention();

可以根据这个规则设计属性名, 可以自动化处理很多映射问题.

包含成员 (再刷)

如果需要在扁平化的过程中需要进行更多控制, 可以使用 IncludeMembers. 当存在子类型到目标类型映射时, 可以通过它将子对象的成员映射到目标类型上 (这一点不同于经典的扁平化, 它不需要提供子类型的映射).

jk: 多态映射中遇到过. 逻辑上这个是组合映射, 而非集成映射.

将数据组合到一个对象中, 然后将该对象映射到另一个对象上. 高级.

细节有待二刷: https://docs.automapper.org/en/stable/Flattening.html#includemembers

这种情况下, IncludeMembers() 配置的顺序很重要, 因为存在同名的属性名, 优先匹配的映射具有高优先级.

Last Updated:
Contributors: jk