在AutoMapper中将复杂类型映射到平面类型

aat*_*que 12 automapper

我有一个复杂的对象,如:

public class BusinessUnit
{
        public TradingDesk TradingDesk { get; }
        public string Division { get; }

        public BusinessUnit(string division, TradingDesk tradingDesk)
        {
            Division = division;
            TradingDesk = tradingDesk;
        }
}
Run Code Online (Sandbox Code Playgroud)

我想将其映射到平面类型:

public class Row
{
   //TradingDesk properties
   public string TraderFirstName { get; set; }
   public string TraderLastName { get; set; }
   public string TradingDeskName { get; set; }

   public string Division { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已经配置AutoMapperTradingDesk:

CreateMap<TradingDesk, Row>().ForMember(vm => vm.TradingDeskName, op => op.MapFrom(src => src.Name));
Run Code Online (Sandbox Code Playgroud)

所以以下测试通过:

[Test]
public void Should_Map_TradingDesk_To_Row()
{
    var tradingDesk = Fixture.Create<TradingDesk>();

    var mapped = AutoMapper.Map<Row>(tradingDesk);

    mapped.TradingDeskName.Should()
            .Be(tradingDesk.Name);
    mapped.TraderFirstName.Should()
            .Be(tradingDesk.Trader.FirstName);
    mapped.TraderLastName.Should()
            .Be(tradingDesk.Trader.LastName);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试映射BusinessUnitRow我必须重新配置AutoMapperTradingDesk这样:

CreateMap<BusinessUnit, Row>()
   .ForMember(vm => vm.TradingDeskName, op => op.MapFrom(src => src.TradingDesk.Name))
   .ForMember(vm => vm.TraderFirstName, op => op.MapFrom(src => src.TradingDesk.Trader.FirstName))
   .ForMember(vm => vm.TraderLastName, op => op.MapFrom(src => src.TradingDesk.Trader.LastName));
Run Code Online (Sandbox Code Playgroud)

我想到的是AutoMapper,当它需要映射应使用已配置的源和目标类型映射TradingDeskRow同时映射BusinessUnit.这样,我可以构建从最小到最大类型的配置,同时展平复杂对象,而无需为展平类型中的每个单独成员定义映射.

Ale*_*scu 1

实际语法可能有所不同,因为我以静态方式使用 AutoMapper,但原理保持不变:

Mapper.CreateMap<BusinessUnit, Row>()
      .ConvertUsing(source => Mapper.Map<TradingDesk, Row>(source.TradingDesk));
Run Code Online (Sandbox Code Playgroud)