2012-11-13 46 views
12

Tôi có khá nhiều đơn vị và cho đến nay, tôi đã làm những thứ như thếBạn có thể yêu cầu AutoMapper trên toàn cầu bỏ qua các thuộc tính bị thiếu khi ánh xạ không?

Mapper.CreateMap<Employee, EmployeeDetailsDTO>() 
    .ForSourceMember(mem => mem.NewsPosts, opt => opt.Ignore()); 

Tôi muốn nói với AutoMapper chỉ đơn giản là bỏ qua tính thiếu trong đối tượng đích đến mà không cần phải xác định mỗi người trong số họ. Cho đến nay, tôi đã không tìm thấy một cách để làm như vậy với nhiều tìm kiếm SO và Google của tôi. Bất cứ ai có một giải pháp? Tôi đã sẵn sàng để làm một số loại vòng lặp hoặc bất cứ điều gì, miễn là nó có thể được viết một lần và nó sẽ quy mô với mô hình/dto thay đổi hoặc thêm tài sản.

Trả lời

7

Khi nào bạn gặp lỗi? Có phải khi bạn gọi AssertConfigurationIsValid?

Nếu có, thì chỉ đơn giản là không gọi phương pháp này

Bạn không cần phải gọi phương pháp này, hãy xem xét các bản đồ sau đó hoạt động:

public class Foo1 
{ 
    public string Field1 { get; set; } 
} 
public class Foo2 
{ 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
} 

Mapper.CreateMap<Foo1, Foo2>(); 
var foo1 = new Foo1() {Field1 = "field1"}; 
var foo2 = new Foo2(); 
Mapper.Map(foo1, foo2);//maps correctly, no Exception 

Bạn có thể muốn gọi AssertConfigurationIsValid cho khác ánh xạ để đảm bảo chúng chính xác, vì vậy thay vào đó, những gì bạn cần làm là sắp xếp ánh xạ của bạn thành Cấu hình:

public class MyMappedClassesProfile: Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Foo1, Foo2>(); 
     //nb, make sure you call this.CreateMap and NOT Mapper.CreateMap 
     //I made this mistake when migrating 'static' mappings to a Profile.  
    } 
} 

Mapper.AddProfile<MyMappedClassesProfile>(); 

và sau đó nếu bạn quyết định bạn muốn kiểm tra tính hợp lệ của các bản đồ (theo từng trường hợp trong tình huống của bạn) sau đó gọi

Mapper.AssertConfigurationIsValid(typeof(MyMappedClassesProfile).FullName); 

quan trọng trong trường hợp của bạn và/hoặc trường hợp bất kỳ nơi bạn dont gọi AssertConfigurationIsValid bạn nên sử dụng một cái gì đó như AutoFixture và Kiểm tra đơn vị để đảm bảo ánh xạ của bạn đang hoạt động. (đó là ý định của AssertConfigurationIsValid)

+0

Đó là khi tôi gọi AssertConfigurationIsValid, nhưng tôi đã sẵn sàng giữ nó trong thử nghiệm đơn vị của mình. Ngay bây giờ nó là trong Global.asax nhưng cuối cùng sẽ di chuyển trong thử nghiệm đơn vị (Đó là một ứng dụng ASP.NET MVC). Vì vậy, về cơ bản bạn đang nói với tôi rằng tôi nên tránh sử dụng AssertConfigurationIsValid và viết thử nghiệm đơn vị của riêng tôi cho DAL của tôi? – Pluc

+0

Tôi không bảo bạn làm điều đó trong * mọi trường hợp ... ở những nơi mà ánh xạ đơn giản sau đó tiếp tục sử dụng AssertConfigurationIsValid. Ở những nơi mà nó trở thành vấn đề bởi vì bạn biết tốt hơn không sử dụng nó. Tuy nhiên, bạn nên tổ chức ánh xạ của mình thành Cấu hình (các lớp mở rộng 'AutoMapper.Profile') vì loại sắp xếp này làm giảm tính chất tĩnh của cấu hình ánh xạ và lời gọi đến' AssertConfigurationIsValid ', sau đó sẽ áp dụng cho mọi khai báo Mapper.Map bạn ' đã thực hiện. – wal

+0

Mọi thực thể sẽ có các thuộc tính bị thiếu vì tôi đang ánh xạ EF POCO tới DTO. Các DTO sẽ không bao giờ chứa các DTO khác mà giữ các ID (quan hệ một-một/nhiều) hoặc gọi kho lưu trữ thích hợp chịu trách nhiệm về thực thể được trả lời lại (với ID của nó làm tham số).Một số chỉ là một tài sản bị thiếu, nhưng tất cả chúng đều có ít nhất một. Tôi không chắc chắn nếu sử dụng Profiles sẽ mang lại cho tôi nhiều như ánh xạ chỉ được cấu hình một lần (vì nó là một ứng dụng web) khi máy chủ web bắt đầu. Tôi cũng chỉ sử dụng AutoMapper cho Model => DTO. Trừ khi tôi bắt đầu sử dụng nó cho ViewModels, tôi không thấy cần thiết. – Pluc

3

Được đề xuất trong wal's answer "không gọi AssertConfigurationIsValid()" không an toàn vì nó sẽ ẩn các lỗi tiềm ẩn trong ánh xạ.
Tốt hơn là bỏ qua ánh xạ một cách rõ ràng giữa các lớp, mà bạn chắc chắn rằng tất cả các thuộc tính cần thiết đã được ánh xạ chính xác. Bạn có thể sử dụng phần mở rộng được tạo trong AutoMapper: "Ignore the rest"? câu trả lời:

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<Src, Dest>(); 
    cfg.IgnoreUnmapped<Src, Dest>(); // Ignores unmapped properties on specific map 
}); 

Phương pháp này cfg.IgnoreUnmapped bỏ qua thuộc tính unmapped trên tất cả các bản đồ và không được khuyến khích, bởi vì nó cũng ẩn bất kỳ vấn đề tiềm năng cho tất cả các lớp học.

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