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
のインスタンスを取得することに注意してください。
これはうまくいくはずです-
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 { } }
});
TypeConverter
を使用して調べることができます。これらは、コンストラクターに依存性注入を持つことができるクラスです。そこでサービスをそこに注入し、ConstructUsing
の後にCreateMap
のようなものを使用します。