2016-02-26 13 views
8

İki varlığım ve iki DTO'm var. Varlıkları DTO'larla eşleştiriyorum. DTOs basitleştirilmiş versiyonları bakmak gibi:Koleksiyonda özellikleri haritalandırmak için AfterMap nasıl kullanılır?

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 ve Bar sınıfları şunlardır:

public class Foo { 

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

public class Bar { 
    // Unimportant properties 
} 

Haritalama

ben gibi bir yöntemde bu haritalama ediyorum:

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 to FooDto ve Bar to BarDto için iyi yapılandırılmış eşlemleri zaten içerir.

Her bir BarDto'yu FooDto'da bir hizmet kullanarak toplamı güncellemem gerekiyor (bunun nedenleri çok uzun sürüyor - bu şekilde olması gerekiyorsa yeterlidir).

Ne sözdizimi bar söz konusu Bar, nerede olduğunu _barTotalService.CalculateTotal(bar) yöntemi kullanarak BarDto her Total özelliği eşlemek için AfterMap kullanmak gerekir?

_barTotalService.CalculateTotal yönteminin Bar örneğini değil BarDto örneğini unutmayın.

+0

'Total' BarDto'' bir özelliktir. FooDto.Bars'ın mülkü olamaz. Ayrıca 'bar' _barTotalService.CalculateTotal (bar) 'da nasıl geçiyor? –

+0

'FooDto'' BarDto' türünde 'Bars' adlı bir koleksiyona sahiptir. Sırasıyla, her 'BarDto'''' Toplam' olarak adlandırılan bir özelliğe sahiptir. Bu "Toplam" özelliğini, eşlenen orijinal "Foo" nesnesinde bulunan "Bar" örneklerini kullanarak ayarlamalıyım. – Graham

cevap

13

Bu çalışması gerekir -

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 { } } 
     }); 
+0

Teşekkürler Amit, ama bunun işe yaramayacağını düşünüyorum. Servis çağrısı BarDto değil 'Bar' örneğini alır. 'For' döngüsü' BarDto'un hedef koleksiyonu üzerinde yineleniyor – Graham

+0

Şimdi iyi çalışıyor mu? –

+0

Tüm iyi Amit. Teşekkür ederim! – Graham

İlgili konular