2013-06-13 22 views
10

Tôi có một dịch vụ đang gọi cho một dịch vụ khác. Cả hai dịch vụ đều sử dụng "cùng một lớp". Các lớp được đặt tên giống nhau và có cùng các thuộc tính nhưng có không gian tên khác nhau vì vậy tôi cần sử dụng AutoMapper để ánh xạ từ một trong các kiểu này sang kiểu khác.AutoMapper tự động tạo createMap

Không có gì đơn giản vì tất cả những gì tôi phải làm là CreateMap<>, nhưng vấn đề là chúng tôi có khoảng hàng trăm lớp mà tôi cần phải viết CreateMap<> từ và nó hoạt động với tôi. Không có chức năng Tự động CreateMap. Vì vậy, nếu tôi nói CreateMap() thì AutoMapper làm việc qua Tổ chức và tìm tất cả các lớp và tự động thực hiện các lớp học CreateMap cho các Lớp này và các lớp con của nó, v.v ...

Hy vọng cho một giải pháp đơn giản, hoặc tôi đoán một số phản ánh có thể sửa nó ..

Trả lời

4

AutoMapper có phương pháp DynamicMap mà bạn có thể sử dụng: đây là một thử nghiệm đơn vị ví dụ minh họa nó.

[TestClass] 
public class AutoMapper_Example 
{ 
    [TestMethod] 
    public void AutoMapper_DynamicMap() 
    { 
     Source source = new Source {Id = 1, Name = "Mr FooBar"}; 

     Target target = Mapper.DynamicMap<Target>(source); 

     Assert.AreEqual(1, target.Id); 
     Assert.AreEqual("Mr FooBar", target.Name); 
    } 

    private class Target 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    private class Source 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 
+1

DynamicMap bây giờ đã lỗi thời, và 'Mapper.Map (foo, opts => opts.CreateMissingTypeMaps = true)' là thay thế khuyến khích. – PeteGO

17

Chỉ cần thiết lập CreateMissingTypeMaps true trong các tùy chọn:

var dto = Mapper.Map<FooDTO> 
    (foo, opts => opts.CreateMissingTypeMaps = true); 

Nếu bạn cần phải sử dụng nó thường xuyên, lưu trữ các lambda trong một lĩnh vực đại biểu:

static readonly Action<IMappingOperationOptions> _mapperOptions = 
    opts => opts.CreateMissingTypeMaps = true; 

... 

var dto = Mapper.Map<FooDTO>(foo, _mapperOptions); 

CẬP NHẬT :

The ap proach được mô tả ở trên không còn hoạt động trong các phiên bản gần đây của AutoMapper.

Thay vào đó, bạn nên tạo một cấu hình mapper với CreateMissingTypeMaps set là true và tạo một đối tượng mapper từ cấu hình này:

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMissingTypeMaps = true; 
    // other configurations 
}); 
var mapper = config.CreateMapper(); 

Nếu bạn muốn tiếp tục sử dụng các API tĩnh cũ (không còn được khuyến cáo), bạn cũng có thể làm điều này:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMissingTypeMaps = true; 
    // other configurations 
}); 
+0

Có thiết lập chung cho điều này không? –

+0

@ChadKapatch, không phải là tôi biết về –

+0

@ThomasLevesque: không hoạt động đối với tôi, cung cấp lỗi như thế này, không chứa định nghĩa cho 'CreateMissingTypeMaps' và không có phương thức mở rộng chấp nhận đối số đầu tiên của loại có thể được tìm thấy. bất kỳ ý tưởng? – Bharat

2

CreateMissingTypeMaps có thể được đặt trong hồ sơ của bạn. Tuy nhiên, nên sử dụng rõ ràng CreateMap cho mỗi ánh xạ và gọi AssertConfigurationIsValid trong các bài kiểm tra đơn vị của bạn cho từng cấu hình để ngăn chặn các lỗi im lặng.

public class MyProfile : Profile { 
    CreateMissingTypeMaps = true; 

    // Mappings... 
} 
+0

chỉ điều này làm việc cho tôi, thiết lập này trong Mapper.Khởi tạo đã không hoạt động. – aeroson