web-dev-qa-db-ja.com

AfterMapを使用してコレクションプロパティにプロパティをマップする方法

2つのエンティティと2つのDTOがあります。エンティティをDTOにマッピングしています。 DTOの簡略版は次のようになります。

_public class FooDto {
     // Other properties removed for clarity.
     public string Description { get; set; }
     public decimal Total { get; set; }
     public ICollection<BarDto> Bars { get; set; }
}

public class BarDto {
     // Other properties removed for clarity.
     public decimal Total { get; set; }
}
_

FooおよびBarクラスは次のとおりです。

_public class Foo {

     public ICollection<Bar> Bars { get; set; }
}

public class Bar {
    // Unimportant properties
}
_

マッピング

これをメソッドにマッピングします:

_public FooDto Map(IMapper mapper, Foo foo) {

        // _fooTotalService and _barTotalService injected elsewhere by DI.

        return mapper.Map<Foo, FooDto>(foo, opt =>
        {
            opt.AfterMap((src, dest) =>
            {
                dest.Total = _fooTotalService.GetTotal(src);
                dest.Bars.Total = ?????? // Needs to use _barTotalService.CalculateTotal(bar)
            });
        });
}
_

AutoMapperには、FooからFooDtoおよびBarからBarDtoへのマッピングがすでに構成されており、正常に機能しています。

FooDtoの各BarDtoを、サービスを使用して合計で更新する必要があります(理由が長すぎるため、この方法で実行する必要があると言えます)。

AfterMapの各Totalプロパティを_barTotalService.CalculateTotal(bar)メソッドを使用してマップするためにBarDtoでどの構文を使用する必要がありますか。ここでbarは問題のBar

__barTotalService.CalculateTotal_メソッドはBarではなくBarDtoのインスタンスを取得することに注意してください。

10
Graham

これはうまくいくはずです-

 AutoMapper.Mapper.CreateMap<Foo, FooDto>()
            .AfterMap((src, dest) =>
            {
                dest.Total = 8;//service call here
                for (var i = 0; i < dest.Bars.Count; i++)
                {
                    dest.Bars.ElementAt(i).Total = 9;//service call with src.Bars.ElementAt(i)
                }
            });
AutoMapper.Mapper.CreateMap<Bar, BarDto>();
var t = AutoMapper.Mapper.Map<FooDto>(new Foo
        {
            Bars = new List<Bar> { new Bar { } }
        });
17

TypeConverterを使用して調べることができます。これらは、コンストラクターに依存性注入を持つことができるクラスです。そこでサービスをそこに注入し、ConstructUsingの後にCreateMapのようなものを使用します。

0
Mike