2017-06-04 12 views
13
public class Foo 
{ 
    public string Baz { get; set; } 
    public List<Bar> Bars { get; set; } 
} 

Khi tôi ánh xạ lớp ở trên, có cách nào xác định mức độ sâu mà tôi muốn tự động ánh xạ đối tượng không? Một số mã giả của những gì tôi theo sau:AutoMapper xác định mức ánh xạ

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 0 }); 
// result = { Baz: "" } 

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 1 }); 
// result = { Baz: "", Bars: [{ Blah: "" }] } 

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 2 }); 
// result = { Baz: "", Bars: [{ Blah: "", Buzz: [{ Baz: "" }] }] } 

// etc... 

Tôi hiện đang sử dụng công cụ tự động 3.3 do phụ thuộc vào bộ phận phụ.

+0

Không có cách nào để đặt cấp trong tự động hóa ngay cả trong phiên bản mới nhất. Vì Bạn chỉ xử lý 1 cấp phân cấp cùng một lúc. Trong trường hợp của bạn, bạn cần 2 cấu hình bản đồ. Một cho 'Foo' và thứ hai cho' Bar'. Bạn có thể sử dụng 'opt.Ignore()' trong cấu hình bản đồ của bạn cho bất kỳ thuộc tính nào mà bạn không muốn ánh xạ. Automapper tự động ánh xạ nếu tên của các đối tượng giống nhau hoặc khớp. Tôi nghĩ trong trường hợp tên đối tượng của bạn là khác nhau và bạn cần cấu hình cho từng đối tượng. – Venky

Trả lời

7

Bạn có thể làm điều đó bằng cách cung cấp một giá trị trong thời gian chạy như đã được trả lời trong câu hỏi: How to ignore a property based on a runtime condition?.

Cấu hình:

Mapper.CreateMap<Foo, FooDTO>().ForMember(e => e.Bars, 
    o => o.Condition(c => !c.Options.Items.ContainsKey("IgnoreBars"))); 

Cách sử dụng:

Mapper.Map<FooDTO>(foo, opts => { opts.Items["IgnoreBars"] = true; }); 

Cùng phương pháp cấu hình mà bạn có thể áp dụng cho tất cả các đối tượng lồng nhau mà bạn gọi cấp.

Nếu bạn muốn đạt được cùng một hành vi cho các thực thể DB của bạn, bạn có thể sử dụng cách tiếp cận ExplicitExpansion như được mô tả trong câu trả lời này: Is it possible to tell automapper to ignore mapping at runtime?.

Cấu hình:

Mapper.CreateMap<Foo, FooDTO>() 
    .ForMember(e => e.Bars, o => o.ExplicitExpansion()); 

Cách sử dụng:

dbContext.Foos.Project().To<FooDTO>(membersToExpand: d => d.Bars); 
Các vấn đề liên quan