扁平化 Flattening
即将一个复杂的数据类型映射到一个简单的数据类型上. 例如:
默认 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()
配置的顺序很重要, 因为存在同名的属性名, 优先匹配的映射具有高优先级.