memberlist - automapper usage




AutoMapperで複合型をフラット型にマップする (2)

AutoMapperを静的に使用しているため、実際の構文は異なる場合がありますが、原則は変わりません。

Mapper.CreateMap<BusinessUnit, Row>()
      .ConvertUsing(source => Mapper.Map<TradingDesk, Row>(source.TradingDesk));

次のような複雑なオブジェクトがあります。

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

        public BusinessUnit(string division, TradingDesk tradingDesk)
        {
            Division = division;
            TradingDesk = tradingDesk;
        }
}

これをフラット型にマッピングしたいです。

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; }
}

私はすでにAutoMapper用にTradingDesk設定しTradingDesk

CreateMap<TradingDesk, Row>().ForMember(vm => vm.TradingDeskName, op => op.MapFrom(src => src.Name));

そのため、次のテストは合格です。

[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);
}

しかし、 BusinessUnitRowにマッピングしようとすると、 TradingDeskようにAutoMapper用にTradingDeskを再設定するAutoMapperがありTradingDesk

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));

BusinessUnitマッピング中にTradingDeskRowにマッピングする必要がある場合、 AutoMapperはすでに構成されているソースと宛先のタイプのマッピングを使用する必要があります。 このようにして、フラット化されたタイプの個々のメンバーごとにマッピングを定義しなくても、複雑なオブジェクトをフラット化しながら、最小から最大のタイプに構成を構築できます。


まず、トレーディングデスク用のマップは、

CreateMap<TradingDesk, Row>();

あなたの目的地のメンバーが "。 'の時にソースメンバーの名前と一致するので、メモリが私に正しく役立つなら 削除された場合は、明示的に指定する必要はありません。

Rowクラスをこれに変更すると

public class Row
{
   //TradingDesk properties
   public string TradingDeskTraderFirstName { get; set; }
   public string TradingDeskTraderLastName { get; set; }
   public string TradingDeskName { get; set; }

   public string Division { get; set; }
}

あなたの地図は

CreateMap<BusinessUnit, Row>(); 

TradingDeskにマッピングする予定がない場合は、そのマップを削除します。

これが何らかのプロファイルで定義されているなら、あなたはまた言うことができます

RecognizePrefixes("TradingDesk"); 

その後、Rowクラスを変更する必要はありません。