2016-02-26 22 views
8

Tôi có hai thực thể và hai DTO. Tôi đang lập bản đồ các thực thể cho các DTO. phiên bản đơn giản của DTOs trông giống như:Cách sử dụng AfterMap để ánh xạ các thuộc tính trên thuộc tính sưu tập

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

Các FooBar lớp là:

public class Foo { 

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

public class Bar { 
    // Unimportant properties 
} 

Các Mapping

Tôi đang lập bản đồ này trong một phương pháp như:

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 đã có ánh xạ được định cấu hình cho Foo thành FooDto và Bar thành BarDto đang hoạt động tốt.

Tôi cần phải cập nhật từng BarDto trong FooDto với tổng số sử dụng một dịch vụ (lý do quá dài để đi vào - đủ để nói rằng nó cần phải xảy ra theo cách này).

cú pháp gì tôi cần phải sử dụng trong AfterMap để ánh xạ mỗi Total tài sản của BarDto sử dụng phương pháp _barTotalService.CalculateTotal(bar), nơi barBar trong câu hỏi?

Lưu ý rằng phương pháp _barTotalService.CalculateTotal có phiên bản Bar không phải BarDto.

+0

'Total' là một tài sản của 'BarDto'. 'FooDto.Bars' không thể có thuộc tính. Ngoài ra, 'thanh' được chuyển trong' _barTotalService.CalculateTotal (thanh) 'như thế nào? –

+0

'FooDto' có một bộ sưu tập có tên là 'Bars' của loại' BarDto'. Đổi lại, mỗi 'BarDto' có một thuộc tính gọi là' Total'. Tôi cần thiết lập thuộc tính 'Total' này bằng cách sử dụng các thể hiện của' Bar' chứa trên đối tượng 'Foo' ban đầu đang được ánh xạ. – Graham

Trả lời

13

này nên làm việc -

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

Cảm ơn Amit, nhưng tôi không nghĩ rằng điều này sẽ làm việc. Cuộc gọi dịch vụ có một phiên bản của 'Bar' không phải' BarDto'. Vòng lặp 'for' đang lặp qua bộ sưu tập đích của' BarDto' – Graham

+0

Bây giờ nó có hoạt động tốt không? –

+0

Tất cả đều tốt. Cảm ơn bạn! – Graham

Các vấn đề liên quan