项目
版本

AutoMapper 嵌套映射

当映射引擎执行映射时,它可以使用多种方法来解析目标成员值。其中一种方法是使用另一个类型映射,其中源成员类型和目标成员类型也在映射配置中设置。这使我们不仅可以展平源类型,还可以创建复杂的目標类型。例如,我们的源类型可能包含另一个复杂类型:

public class OuterSource
{
	public int Value { get; set; }
	public InnerSource Inner { get; set; }
}

public class InnerSource
{
	public int OtherValue { get; set; }
}

我们可以简单地将 OuterSource.Inner.OtherValue 展平为一个 InnerOtherValue 属性,但我们也可能希望为 Inner 属性创建一个对应的复杂类型:

public class OuterDest
{
	public int Value { get; set; }
	public InnerDest Inner { get; set; }
}

public class InnerDest
{
	public int OtherValue { get; set; }
}

在这种情况下,我们需要配置额外的源/目标类型映射:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<OuterSource, OuterDest>();
    cfg.CreateMap<InnerSource, InnerDest>();
});
config.AssertConfigurationIsValid();

var source = new OuterSource
	{
		Value = 5,
		Inner = new InnerSource {OtherValue = 15}
	};
var mapper = config.CreateMapper();
var dest = mapper.Map<OuterSource, OuterDest>(source);

dest.Value.ShouldEqual(5);
dest.Inner.ShouldNotBeNull();
dest.Inner.OtherValue.ShouldEqual(15);

这里需要注意几点:

  • 配置类型的顺序不重要
  • 调用 Map 不需要指定任何内部类型映射,只需指定用于传递的源值的类型映射即可

通过展平和嵌套映射,我们可以创建各种目的地形状,以满足我们的任何需求。

在本文档中