2012-10-25 30 views
17

Tôi có một số mã tương tự như những gì dưới đây. Về cơ bản nó đại diện cho việc nhận dữ liệu từ một dịch vụ web và chuyển đổi nó thành các đối tượng phía máy khách.Định cấu hình AutoMapper để ánh xạ tới các loại bê tông nhưng cho phép Giao diện trong định nghĩa của lớp học của tôi

void Main() 
{ 
    Mapper.CreateMap<SomethingFromWebService, Something>();  
    Mapper.CreateMap<HasSomethingFromWebService, HasSomething>(); 
    // Service side 
    var hasSomethingFromWeb = new HasSomethingFromWebService(); 
    hasSomethingFromWeb.Something = new SomethingFromWebService 
      { Name = "Whilly B. Goode" }; 
    // Client Side     
    HasSomething hasSomething=Mapper.Map<HasSomething>(hasSomethingFromWeb); 
}  
// Client side objects 
public interface ISomething 
{ 
    string Name {get; set;} 
}  
public class Something : ISomething 
{ 
    public string Name {get; set;} 
}  
public class HasSomething 
{ 
    public ISomething Something {get; set;} 
}  
// Server side objects 
public class SomethingFromWebService 
{ 
    public string Name {get; set;} 
}  
public class HasSomethingFromWebService 
{ 
    public SomethingFromWebService Something {get; set;} 
} 

Vấn đề tôi có là tôi muốn sử dụng Giao diện trong các lớp của mình (HasSomething.ISomething trong trường hợp này), nhưng tôi cần có bản đồ AutoMapper cho các loại cụ thể. (Nếu tôi không lập bản đồ bê tông các loại sau đó AutoMapper sẽ tạo proxy cho tôi đó gây ra các vấn đề khác trong ứng dụng của tôi..)

Đoạn mã trên mang lại cho tôi lỗi này:

Missing type map configuration or unsupported mapping.

Mapping types: SomethingFromWebService -> ISomething
UserQuery+SomethingFromWebService -> UserQuery+ISomething

Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể ánh xạ tới một loại cụ thể và vẫn sử dụng các giao diện trong lớp của tôi?

LƯU Ý: Tôi đã thử thêm bản đồ này:

Mapper.CreateMap<SomethingFromWebService, ISomething>(); 

Nhưng sau đó các đối tượng quay trở lại không phải là loại Something nó trả về một Proxy tạo sử dụng ISomething như bản mẫu.

Trả lời

28

Vì vậy, tôi đã tìm ra một thứ có vẻ hoạt động.

Nếu tôi thêm hai ánh xạ sau đây:

Mapper.CreateMap<SomethingFromWebService, Something>(); 
Mapper.CreateMap<SomethingFromWebService, ISomething>().As<Something>(); 

sau đó nó hoạt động như tôi muốn.

Tôi chưa thể tìm thấy bất kỳ tài liệu nào về phương pháp 'As' (thử googling cho điều đó! :), nhưng có vẻ như đó là một chuyển hướng ánh xạ.

Ví dụ: Đối với ánh xạ này (ISomething), hãy giải quyết nó As a Something.

+1

Cảm ơn điều này, điều này đã giúp tôi rất nhiều. Trừ khi tôi nhầm, bạn chỉ cần ánh xạ thứ hai. Tôi nghĩ rằng bản đồ thứ hai phải làm cho dự phòng đầu tiên? –

+2

Không, bạn vẫn cần ánh xạ đầu tiên cho loại bê tông, nếu không AutoMapper sẽ không biết cách ánh xạ từ SomethingFromWebService đến Something – TheWho

+1

Cảm ơn rất nhiều vì điều này! Tôi đang đấu tranh trong 2 giờ và sửa lỗi của tôi! – Speuline

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