Cách chỉ định quy tắc ánh xạ khi tên của các thuộc tính khác nhau


144

Tôi là người mới làm quen với khung Automapper. Tôi có một lớp miền và một lớp DTO như sau:

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

Lưu ý: Tên thuộc tính " Tên " của Employeelớp không giống với tên của thuộc tính " FullName " của EmployeeDtolớp.

Và đây là mã để ánh xạ Employeeđối tượng tới EmployeeDto:

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

Câu hỏi của tôi là: Nếu tôi muốn ánh xạ Employee(lớp nguồn) sang EmployeeDto(lớp đích), làm cách nào tôi có thể chỉ định quy tắc ánh xạ? Nói cách khác, tôi nên làm gì nhiều hơn với dòng mã (***) ở trên?

Câu trả lời:


292

Không sao, bản thân tôi đã tìm ra giải pháp:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

1
Có cách nào để chỉ định nó trên toàn cầu cho bất kỳ lớp nào, một cái gì đó như tiền tố / hậu tố không? Ví dụ, tôi có một nhóm các lớp cho một thư viện có thuộc tính "Bản địa hóa". Và tôi muốn ánh xạ chúng tới các lớp trong đó thuộc tính tương ứng được gọi là "LocalizedName". Có phải lựa chọn duy nhất của tôi là thêm ForMember cho mỗi cấu hình ánh xạ?
NickAb

2
không có phương thức
CreatMap

3
@ Navid_pdp11 có. Bạn cần phải có Mapper lớp tĩnh không phải là một thể hiện
Jordy van Eijk

@JordyvanEijk Phiên bản nào bạn đang sử dụng có phương thức "Tạo bản đồ" tĩnh? Trong 5.1.1.0 không có điều đó
Matt Thomas

6
@MattThomas Sau khi xem qua github của automapper, tôi thấy rằng phiên bản 5.0 CreatMap đã lỗi thời và họ nói rằng bạn cần sử dụng MapperConfiguration hoặc Mapper.Initialize.
Jordy van Eijk

7

Chỉ cần đưa các ý kiến ​​trên vào một cách tiếp cận được cập nhật bằng Automapper 8.1 + ...

var mapConfig = new MapperConfiguration(
   cfg => cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

Sau đó, bạn sẽ xây dựng trình ánh xạ bằng mapConfig:

var mapper = mapConfig.CreateMapper();

2

Chúng ta cũng có thể chỉ định các thuộc tính Class để ánh xạ

Từ https://docs.automapper.org/en/urdy/Conventions.html#attribution-support

Hỗ trợ thuộc tính

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Hiện tại luôn luôn bật

Tìm kiếm các phiên bản của SourceToDestinationMapperAttribution cho Thuộc tính / Trường và gọi hàm isMatch do người dùng xác định để tìm kết quả khớp thành viên.

MapToAttribution là một trong số chúng sẽ khớp với thuộc tính dựa trên tên được cung cấp.

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

Khi trích dẫn nội dung từ một nơi khác nguyên văn, hãy chắc chắn sử dụng định dạng trích dẫn khối để làm cho người đọc thấy rõ rằng nội dung được sao chép.
TylerH


Rất mới để stackoverflow. Chắc chắn sẽ tuân theo các quy tắc @TylerH
Pranay DevOps
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.