2010-10-22 96 views
5

Câu hỏi của tôi có thể là ngớ ngẩn, nhưng tôi khá chắc chắn tôi bỏ lỡ một phần rất quan trọng của vấn đề. Tôi phải làm một số đối tượng để ánh xạ đối tượng (giữa các lớp miền được sử dụng trong dự án C# và các lớp được gửi tới các máy khách flash).Ưu điểm của việc sử dụng Automapper là gì?

Lựa chọn đầu tiên của tôi là Automapper. Nhưng Ive đã có một số vấn đề với nó (thuộc tính lồng nhau, không phải constructor không xác định). Nó chỉ ra rằng nó không phải là quá dễ dàng để bản đồ một loại thực sự phức tạp với automapper.

Sau đó, câu hỏi của tôi là: Tại sao không thực hiện các phương pháp như:

ClassA GetClassAByClassB(ClassB pObj) 

    { 
    ClassA objA = new ClassA(); 
    objA.Prop1 = pObj.Prop1; 
    objA.NestedType.Prop2 = pObj.Prop2; 
    //....Some more..... 
    return objA; 
    } 

Nó có chính xác cùng một mức độ linh hoạt như lập bản đồ thực hiện bằng Automapper. Bạn vẫn phải cung cấp thuộc tính nào từ đối tượng nguồn được sao chép vào những thuộc tính nào trong đối tượng đích. Bạn chỉ cần làm điều này bằng cách sử dụng '=' và không phải là biểu thức lambda.

Nhưng nếu bạn thay đổi thứ gì đó trong các lớp miền, bạn phải thay đổi phần "ánh xạ" này. Vì vậy, điều chính mà nên thuyết phục tôi sử dụng Automapper (như tôi đã nói lúc đầu tôi khá chắc chắn tôi đang thiếu một cái gì đó quan trọng).

Trả lời

3

Bởi vì với AutoMapper bạn không phải thực hiện các phương pháp đó ;-)

cách tiếp cận của bạn đòi hỏi phải viết rất nhiều

classA.propA = classB.propA; 
classA.propB = classB.propB; 
classA.propC = classB.propC; 
classA.propD = classB.propD; 
classA.propE = classB.propE; 

AutoMapper sử dụng công ước để tìm nó chính nó. Hơn nữa, bạn không cần phải lo lắng về pObj == null (mã của bạn sẽ ném NulLReferenceException trong trường hợp này).

Bạn cũng có thể xác định chuyển đổi trong bản đồ của mình (ví dụ: chuỗi thành Ngày giờ).

Mapper.CreateMap<User, UserModel>().ForMember(d => d.LastLogin, c => c.MapFrom<DateTime?>(u => u.Credential.LastLogin)); 

AutoMapper cũng hỗ trợ các thuộc tính lồng nhau.

đọc thêm ở đây: AutoMapper Introduction and Samples

+0

Điều gì về các thuộc tính không có cùng tên? Và thuộc tính lồng nhau? Tôi nghĩ rằng tôi nên thay đổi các công ước, nhưng đôi khi tài sản ở một bên là 'PositionX' và ở phía bên kia chỉ là 'X'. (chỉ là một ví dụ - các thuộc tính anmes có thể là khá khó đoán). Vì vậy, không phải là nó như tôi không nên sử dụng Automapper trong trường hợp của tôi? – Katalonis

+0

@Katalonis - Sau đó, bạn định cấu hình trình lập bản đồ theo cách an toàn loại bằng lambdas. Đã thêm mẫu mã và liên kết. –

1

Một lợi ích mà AutoMapper tuyên bố có là lập bản đồ theo quy ước. Dưới đây là một trích dẫn từ "AutoMapper Introduction and Samples"

"ẩn nấp vẻ đẹp của AutoMapper. Khi lớp học của bạn phù hợp tự thông thường, cấu hình bản đồ của bạn có thể là đơn giản"

lợi ích này đi kèm với một chi phí. Đổi tên hoặc thay đổi cả thuộc tính đích và nguồn sẽ phá vỡ ánh xạ và giới thiệu các lỗi thời gian chạy thay vì biên dịch các lỗi.

Nếu bạn không thể dựa vào ánh xạ quy ước, AutoMapper sẽ mất lợi thế của nó. Trong trường hợp này, tôi muốn viết một chức năng nhà máy như dưới đây.

public static ClassA MapToClassA(this ClassB b) 
{ 
    return new ClassA() 
    { 
     propA = b.propA; 
     propB = b.propB; 
     propC = b.propC; 
    } 
} 

Sau đó, bạn sẽ xây dựng các đối tượng đích như sau

var classA = classB.MapToClassA(); 

thay vì

var classA = Mapper.Map<ClassB, ClassA>(classB) 

Cá nhân, tôi muốn các chức năng nhà máy ngay cả khi lập bản đồ quy ước là có thể cho minh bạch, khả năng đọc của mình và gỡ lỗi thân thiện. Chúc may mắn khi cố gắng tìm hiểu, trong trường hợp thứ hai, ClassB được ánh xạ tới ClassA như thế nào, cho dù hồ sơ ánh xạ được tải hay tại sao có một ngoại lệ khi hàm Map <>() được gọi hoặc tại sao một số thuộc tính đã được gán một giá trị sai.

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