2012-01-14 33 views
8

Hoặc là tôi không hoặc không hoạt động ... Tôi có một lớp Nguồn duy nhất mà tôi muốn ánh xạ tới nhiều chế độ xem được kế thừa từ nhau.Tôi có sử dụng chức năng Bao gồm của Automapper 2.0 chính xác không?

Về cơ bản lớp cơ sở là Chi tiết và lớp con là Chỉnh sửa hoặc Cập nhật sử dụng cùng một dữ liệu như Chi tiết, cộng với một vài trường khác để quản lý danh sách của riêng chúng hoặc bất kỳ thứ gì.

Dưới đây là các bản đồ tôi đang sử dụng:

Mapper.CreateMap<Ticket, Detail>() 
       .Include<Ticket, Update>() 
       .Include<Ticket, Edit>() 
       .ForMember(dest => dest.Priority, opt => opt.MapFrom(src => src.Priority.Code)) 
       .ForMember(dest => dest.TicketID, opt => opt.MapFrom(src => src.ID)) 
       .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.StatusCode)) 
       .ForMember(dest => dest.Category, opt => opt.MapFrom(src => src.ProblemCategoryCode)) 
       .ForMember(dest => dest.crmBusCode, opt => opt.MapFrom(src => src.Company.crmBusCode)) 
       .ForMember(dest => dest.TeamMembers, opt => opt.MapFrom(src => src.Schedules.Where(s => s.CompleteTime == null))); 

      Mapper.CreateMap<Ticket, Update>() 
       .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules.Where(s => s.EmployeeID == Util.CurrentUserID() && s.CompleteTime == null))); 

      Mapper.CreateMap<Ticket, Edit>(); 

Sau đó, nếu tôi Mapper.Map (vé) bất kỳ thuộc tính sử dụng MapFrom không nhận được đánh giá, họ chỉ kết thúc với giá trị mà họ đã có nếu không có bản đồ được thiết lập.

Vậy có gì sai ở đây?

+0

Bạn đang sử dụng phiên bản Automapper nào? – nemesv

+0

Tôi đang sử dụng phiên bản 2.0 – CodeRedick

Trả lời

7

Là giải pháp thay thế nếu bạn không muốn gọi Mapper.Map hai lần. Bạn có thể di chuyển các ánh xạ chung của Detail thành một phương pháp khuyến nông:

public static class MappingExtensions 
{ 
    public static IMappingExpression<Ticket, TDest> MapDetailProperties<TDest>(
     this IMappingExpression<Ticket, TDest> mapBase) where TDest : Detail 
    { 
     return mapBase 
      .ForMember(dest => dest.Priority, 
       opt => opt.MapFrom(src => src.Priority.Code)) 
      ///.... 
      .ForMember(dest => dest.TeamMembers, 
       opt => opt.MapFrom(src => src 
        .Schedules.Where(s => s.CompleteTime == null))); 
    } 
} 

Và sau đó sử dụng phương pháp mở rộng khi đăng ký Ticket -> UpdateTicket -> Edit người vẽ bản đồ:

Mapper.CreateMap<Ticket, Update>() 
    .MapDetailProperties() 
    .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules 
     .Where(s => s.EmployeeID == Util.CurrentUserID() && 
      s.CompleteTime == null))); 

Mapper.CreateMap<Ticket, Edit>() 
    .MapDetailProperties(); 

Sau đó, bạn có thể sử dụng Bản đồ bình thường:

Ticket ticket = new Ticket();  
var edit = Mapper.Map<Ticket, Edit>(ticket); 
var update = Mapper.Map<Ticket, Update>(ticket); 
+1

Làm việc nhiều hơn một chút, nhưng chắc chắn dường như là một cách phù hợp để thực hiện! Tôi có phải là người duy nhất nghĩ rằng nó sẽ có ý nghĩa hơn cho Bao gồm về cơ bản hành động như phương pháp mở rộng này? – CodeRedick

+0

Giải pháp cho vấn đề tương tự của tôi hơi khác một chút nhưng nó sử dụng khái niệm cốt lõi của một phương pháp mở rộng tĩnh. Tôi muốn AutoMapper sẽ hỗ trợ này ra khỏi hộp và hy vọng họ sẽ trong tương lai. –

5

Tôi có sử dụng chức năng Bao gồm của Automapper 2.0 chính xác không?

Không - Khi bạn sử dụng .Include, AutoMapper hy vọng rằng các lớp học nơi đang ở trong một hệ thống cấp bậc tương tự như các lớp nguồn (Điều này được thảo luận thêm here). Nói cách khác, nếu bạn đã ánh xạ tới các lớp con khác nhau của Ticket tới Detail, UpdateEdit, Include sẽ là thích hợp.

Điều này có vẻ không hữu ích trong trường hợp của bạn. Tôi sẽ khuyên bạn nên sử dụng quá tải của .Map mà mất một đối tượng hiện có và sửa đổi nó. Bằng cách đó, bạn chỉ phải xác định ánh xạ cho loại cơ sở:

Ticket ticket = new Ticket(); 
Edit edit = new Edit(); 

Mapper.Map<Ticket, Detail>(ticket, edit); 
// Edit has now been automapped using the base mapping. 

Mapper.Map<Ticket, Edit>(ticket, edit); 
// The properties unique to Edit have now been mapped. 
Các vấn đề liên quan