Trong trường hợp các bộ định tuyến đích của tôi là riêng tư, tôi có thể muốn ánh xạ tới đối tượng bằng cách sử dụng hàm tạo của đối tượng đích. Làm thế nào bạn sẽ làm điều này bằng cách sử dụng Automapper?Tự động hóa - cách ánh xạ tới tham số hàm tạo thay vì các bộ định vị thuộc tính
Trả lời
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; }
}
}
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));
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
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)));
- 1. Ánh xạ các tham số URI vào các thuộc tính của đối tượng tham số?
- 2. Ánh xạ chỉ vài thuộc tính thay vì sử dụng Automapper
- 3. Làm cách nào để tuần tự hóa tất cả các thuộc tính của đối tượng được ánh xạ NHibernate?
- 4. Cách trường thuộc tính của một HttpServletRequest ánh xạ tới một yêu cầu HTTP thô?
- 5. Ánh xạ NHibernate khi các mối quan hệ tự tham gia có các thuộc tính bổ sung
- 6. Làm cách nào để truyền các tham số động tới chức năng ánh xạ trên bản đồ GAE?
- 7. ASP.NET MVC - Qua JSON DateTime để điều khiển không ánh xạ tới tham số điều khiển
- 8. Python, lập trình hàm, ánh xạ tới mức cao hơn
- 9. Các ký tự ánh xạ lõi của
- 10. Ruby - ánh xạ mảng tới hashmap
- 11. Các tham số hàm tạo mặc định trong pyyaml
- 12. EF 4.0 - ánh xạ tới thuộc tính chỉ đọc với trường riêng
- 13. Cách xác định ánh xạ trong elasticsearch không chấp nhận các trường khác mà các ánh xạ được ánh xạ?
- 14. cách tạo mô hình Django không ánh xạ tới bảng cơ sở dữ liệu
- 15. Cách xác định quy tắc ánh xạ khi tên các thuộc tính khác nhau
- 16. Ánh xạ tự động tới một giao diện: Ngoại lệ "Phương thức không được triển khai"
- 17. Thuộc tính AssemblyInfo ánh xạ tới Win32 VERSIONINFO như thế nào?
- 18. Ánh xạ các nút riêng lẻ trên ASP.NET MVC Xem tới các hành động điều khiển
- 19. Tạo biến chung từ một loại - Cách thực hiện? Hoặc sử dụng Activator.CreateInstance() với thuộc tính {} thay vì tham số()?
- 20. Thiết lập thuộc tính ánh xạ khóa Doctrine_Collection trong schema.yml
- 21. ánh xạ extbase tới bảng hiện có không hoạt động
- 22. java, hibernate: ánh xạ thuộc tính với truy vấn
- 23. Truy vấn các thuộc tính chưa được ánh xạ trong nhibernate
- 24. Có thể tự động ánh xạ từ một từ điển các thuộc tính đến một điểm đến bằng phẳng không?
- 25. Tại sao JAXB đôi khi ánh xạ tới JAXBElement?
- 26. Cách tạo một số ánh xạ URL tùy thuộc vào môi trường?
- 27. Twilio: Cách ánh xạ trả lời SMS tới SMS gốc
- 28. Hibernate: Thêm thuộc tính vào lớp của tôi không được ánh xạ tới bảng db
- 29. Tham chiếu tốt về cách scala được ánh xạ tới jvm bytecode
- 30. C# tự động hóa thuộc tính tự động hóa của JSON
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
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
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()); –