2010-01-19 3 views
16

Điều gì là Automapper cho? Làm thế nào nó sẽ giúp tôi với tên miền của tôi và lớp điều khiển (asp.net mvc)Automapper là gì?

+1

Câu hỏi có liên quan/trùng lặp có thể xảy ra (nhưng bao gồm ví dụ tốt) là

+1

Đây là giải thích tốt: http: // www. kunal-chowdhury.com/2013/01/what-is-automapper-and-how-to-map-objects.html – JoshYates1980

Trả lời

28

Có lẽ một ví dụ sẽ giúp ở đây ...

Hãy nói rằng bạn có một schema cơ sở dữ liệu độc đáo-bình thường như thế này:

 
Orders  (OrderID, CustomerID, OrderDate) 
Customers (CustomerID, Name) 
OrderDetails (OrderDetID, OrderID, ProductID, Qty) 
Products  (ProductID, ProductName, UnitPrice) 

Và giả sử bạn đang sử dụng một đẹp Người lập bản đồ O/R đưa bạn trở lại một mô hình miền được tổ chức tốt:

 
OrderDetail 
+--ID 
+--Order 
|--+--Date 
|--+--Customer 
|-----+--ID 
|-----+--Name 
+--Product 
|--+--ID 
|--+--Name 
|--+--UnitPrice 
+--Qty 

Bây giờ, bạn được yêu cầu hiển thị mọi thứ được sắp xếp trong e tháng trước. Bạn muốn ràng buộc điều này với một lưới phẳng, vì vậy bạn dutifully viết một lớp phẳng để ràng buộc:

public class OrderDetailDto 
{ 
    public int ID { get; set; } 
    public DateTime OrderDate { get; set; } 
    public int OrderCustomerID { get; set; } 
    public string OrderCustomerName { get; set; } 
    public int ProductID { get; set; } 
    public string ProductName { get; set; } 
    public Decimal ProductUnitPrice { get; set; } 
    public int Qty { get; set; } 

    public Decimal TotalPrice 
    { 
     get { return ProductUnitPrice * Qty; } 
    } 
} 

Đó là khá đau cho đến nay, nhưng những gì bây giờ? Làm thế nào để chúng tôi biến một bó của OrderDetail s thành một bó của OrderDetailDto s để ràng buộc dữ liệu?

Bạn có thể đặt một hàm tạo trên OrderDto mất OrderDetail và viết một mớ hỗn độn lớn của mã ánh xạ. Hoặc bạn có thể có một lớp chuyển đổi tĩnh ở đâu đó. Hoặc, bạn có thể sử dụng AutoMapper và viết thay thế này:

Mapper.CreateMap<OrderDetail, OrderDetailDto>(); 
OrderDetailDto[] items = 
    Mapper.Map<OrderDetail[], OrderDetailDto[]>(orderDetails); 
GridView1.DataSource = items; 

Ở đó. Chúng tôi đã chỉ mất những gì nếu không sẽ là một mớ hỗn độn kinh tởm của mã lập bản đồ vô nghĩa và giảm nó thành ba dòng (thực sự chỉ là hai cho các bản đồ thực tế).

Điều đó có giúp giải thích mục đích không?

+0

Gần như mọi thứ. Nếu u thêm nhiều hơn về sức mạnh của Automapper, tôi chắc chắn mọi người sẽ upvote ... –

3

Nếu bạn có một đối tượng của một loại và bạn muốn điền các thuộc tính của một đối tượng thuộc loại khác sử dụng thuộc tính từ loại đầu tiên, bạn có hai lựa chọn:

  1. Viết mã theo cách thủ công để thực hiện ánh xạ như vậy.
  2. Sử dụng công cụ sẽ tự động xử lý việc này cho bạn.

AutoMapper là một ví dụ về 2.

Việc sử dụng phổ biến nhất là san bằng mô hình thành một đối tượng chuyển giao dữ liệu (hoặc, nói chung, lập bản đồ qua các biên giới lớp). Điều rất hay về AutoMapper là cho các kịch bản phổ biến, bạn không phải thực hiện bất kỳ cấu hình nào (convention over configuration).

0

Ánh xạ đối tượng giữa các lớp. Tốt dụ: Here