2010-02-10 32 views

Trả lời

113

Sử dụng ConstructUsing

này sẽ cho phép bạn xác định các nhà xây dựng để sử dụng trong việc lập bản đồ. nhưng sau đó tất cả các thuộc tính khác sẽ được tự động ánh xạ theo các quy ước.

Cũng lưu ý rằng điều này khác với ConvertUsing trong việc chuyển đổi đó sẽ không tiếp tục ánh xạ qua các quy ước, thay vào đó nó sẽ cho bạn toàn quyền kiểm soát ánh xạ.

Mapper.CreateMap<ObjectFrom, ObjectTo>() 
    .ConstructUsing(x => new ObjectTo(arg0, arg1, etc)); 

...

using AutoMapper; 
using NUnit.Framework; 

namespace UnitTests 
{ 
    [TestFixture] 
    public class Tester 
    { 
     [Test] 
     public void Test_ConstructUsing() 
     { 
      Mapper.CreateMap<ObjectFrom, ObjectTo>() 
       .ConstructUsing(x => new ObjectTo(x.Name)); 

      var from = new ObjectFrom { Name = "Jon", Age = 25 }; 

      ObjectTo to = Mapper.Map<ObjectFrom, ObjectTo>(from); 

      Assert.That(to.Name, Is.EqualTo(from.Name)); 
      Assert.That(to.Age, Is.EqualTo(from.Age)); 
     } 
    } 

    public class ObjectFrom 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 

    public class ObjectTo 
    { 
     private readonly string _name; 

     public ObjectTo(string name) 
     { 
      _name = name; 
     } 

     public string Name 
     { 
      get { return _name; } 
     } 

     public int Age { get; set; } 
    } 
} 
+0

Tôi đoán "ConstructUsing" phải nằm trong phiên bản mới hơn của trình tự động hóa so với phiên bản đang sử dụng. Cảm ơn Jon – jlembke

+6

Cảm ơn rất nhiều vì ví dụ này Jon. "ConstructUsing" thật tuyệt! Cho phép tôi giữ DTO của mình không thay đổi được với những người định cư được đánh dấu là riêng tư. – Daniel

+3

Làm việc với tôi; AutoMapper hiện không giống như các hàm tạo, trong đó tất cả các tham số là tùy chọn, vì vậy tôi chỉ sử dụng .ConstructUsing (x => new MyClass()); –

7

Bạn nên sử dụng phương pháp Map cho phép bạn thiết lập các đích. Ví dụ:

Mapper.CreateMap<ObjectFrom, ObjectTo>() 

var from = new ObjectFrom { Name = "Jon", Age = 25 }; 

var to = Mapper.Map(from, new ObjectTo(param1)); 
0

Tại thời điểm viết câu trả lời này, AutoMapper sẽ làm điều này tự động (với một CreateMap<>() gọi đơn giản) cho bạn nếu các thuộc tính phù hợp với các thông số constructor. Tất nhiên, nếu mọi thứ không phù hợp thì sử dụng .ConstructUsing(...) là cách để đi.

public class PersonViewModel 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

public class Person 
{ 
    public Person (int id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 

    public int Id { get; } 

    public string Name { get; } 
} 

public class PersonProfile : Profile 
{ 
    public PersonProfile() 
    { 
     CreateMap<PersonProfile, Person>(); 
    } 
} 

Lưu ý: Giả sử bạn đang sử dụng Profiles để thiết lập ánh xạ tự động của bạn.

Khi được sử dụng như dưới đây, điều này tạo ra các đối tượng chính xác:

var model = new PersonModel 
{ 
    Id = 1 
    Name = "John Smith" 
} 

// will correctly call the (id, name) constructor of Person 
_mapper.Map<Person>(model); 

Bạn có thể đọc thêm về xây dựng automapper trong wiki on GitHub

2

Cách tốt nhất chính thức là sử dụng phương pháp ghi nhận từ AutoMapper https://github.com/AutoMapper/AutoMapper/wiki/Construction

public class SourceDto 
{ 
     public SourceDto(int valueParamSomeOtherName) 
     { 
      Value = valueParamSomeOtherName; 
     } 

     public int Value { get; } 
} 

Mapper.Initialize(cfg => cfg.CreateMap<Source, SourceDto>().ForCtorParam("valueParamSomeOtherName", opt => opt.MapFrom(src => src.Value))); 
Các vấn đề liên quan