2012-06-21 15 views
25

Hôm nay tôi đã nâng cấp một ứng dụng đầy đủ chức năng bằng cách sử dụng AutoMapper v1.1 để sử dụng AutoMapper v2.1 và tôi gặp một số vấn đề mà tôi chưa bao giờ gặp phải khi sử dụng phiên bản trước.AutoMapper sử dụng hàm tạo sai

Dưới đây là một ví dụ về lập bản đồ mã của tôi trở lại từ dto để miền đối tượng

public class TypeOne 
{ 
    public TypeOne() 
    { 
    } 

    public TypeOne(TypeTwo two) 
    { 
     //throw ex if two is null 
    } 

    public TypeOne(TypeTwo two, TypeThree three) 
    { 
     //throw ex if two or three are null 
    } 

    public TypeTwo Two {get; private set;} 

    public TypeThree Three {get; private set;} 
} 

public class TypeOneDto 
{ 
    public TypeOneDto() 
    { 
    } 

    public TypeTwoDto Two {get; set;} 

    public TypeThreeDto Three {get; set;} 
} 

...

Mapper.CreateMap<TypeThreeDto, TypeThree>(); 
Mapper.CreateMap<TypeTwoDto, TypeTwo>(); 
Mapper.CreateMap<TypeOneDto, TypeOne>(); 

var typeOne = Mapper.Map<TypeOne>(typeOneDto); 

Tuy nhiên vấn đề đầu tiên tôi gặp phải với v2.1 là rằng AutoMapper đã cố gắng sử dụng constructor với 2 args khi một trong các arg là null và nên sử dụng hàm tạo 1 arg.

sau đó tôi cố gắng sử dụng

Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne()); 

Nhưng tôi vẫn tiếp tục nhận được một lỗi 'Invocation nhập nhằng' mà tôi không thể giải quyết.

sau đó tôi đã cố gắng

Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne()); 

và điều đó đã tạo thành công các đối tượng TypeOne sử dụng constructor parameterless nhưng sau đó nó thất bại trong việc thiết lập các thuộc tính setter tin.

Tôi đã tìm kiếm trợ giúp trên trang web AutoMapper và tải xuống mã nguồn để có giao diện đẹp nhưng không nhận được nhiều tài liệu nhỏ và không có nhiều bài kiểm tra đơn vị cho ConstructUsing.

Có điều gì hiển nhiên tôi thiếu mà tôi nên thay đổi với phiên bản v2.1 không? Tôi ngạc nhiên rằng nó đã thay đổi rất nhiều từ v1.1.

+0

thể trùng lặp của [Automapper - làm thế nào để ánh xạ các tham số nhà xây dựng thay vì setters tài sản] (http://stackoverflow.com/questions/2239143/automapper-how-to-map-to-constructor-parameters- thay vì bất động sản-setters) –

+0

Tôi tiếp tục nhận được cùng một lỗi tôi đề cập ở trên khi sử dụng "ConstructUsing". "Yêu cầu không rõ ràng" khi tôi tạo một đối tượng mới với hàm tạo ít tham số. –

Trả lời

48

Bạn chỉ cần thêm explicit cast để

Func<ResolutionContext, TypeOne> 

Đây là mã:

Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(
      (Func<ResolutionContext, TypeOne>) (r => new TypeOne())); 

Phiên bản hiện tại của AutoMapper hoạt động như mô tả dưới đây:

  1. Sắp xếp loại nhà xây dựng điểm đến theo số tham số

    destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length); 
    
  2. Đưa hàm tạo đầu tiên tham số khớp với thuộc tính nguồn (không có bất kỳ kiểm tra nào cho giá trị null). Trong trường hợp của bạn, nó là hàm tạo với hai tham số.

+0

Điều này vừa cứu tôi một số đau buồn. Hoạt động hoàn hảo trên phiên bản mới nhất của AutoMapper (3.2.1.0) :) Cảm ơn! – Stu1986C

+3

Mặc dù đây là một bài viết khá cũ, tôi rất vui vì tôi đã tìm thấy nó: Trình tự của những gì AutoMapper xem xét một kết hợp cho hàm tạo dường như đã thay đổi một lần nữa với phiên bản 4.0,4. Để tránh các vấn đề, nó có thể ở bên bảo thủ hơn để luôn xác định hàm tạo của AutoMapper nào nếu bạn có nhiều hơn một hàm tạo. Ngoài ra, như là một khuyến nghị thứ hai, có một thử nghiệm tự động tại chỗ mà thiết lập tất cả các bản đồ sau đó gọi 'Mapper.AssertConfigurationIsValid()'. Bằng cách đó bạn có thể vô hiệu hóa vấn đề sớm. Chúc mừng mã hóa! – Manfred