如果我的目标setter是私人的,我可能想要使用目标对象的构造函数映射到对象。你如何使用Automapper来做到这一点?Automapper - 如何映射到构造函数参数而不是属性设置器
80
A
回答
113
使用ConstructUsing
这将允许您指定的映射过程中使用哪个构造。但随后所有其他属性将根据约定自动映射。
另外请注意,这是不同于ConvertUsing
在转换使用将不会继续映射通过约定,它会让你完全控制的映射。
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; }
}
}
7
您应该使用Map
方法,可以让你设定的目标。例如:
Mapper.CreateMap<ObjectFrom, ObjectTo>()
var from = new ObjectFrom { Name = "Jon", Age = 25 };
var to = Mapper.Map(from, new ObjectTo(param1));
0
在写这个答案的时候,AutoMapper将自动(用一个简单的电话CreateMap<>()
)为您如果属性匹配的构造函数的参数做到这一点。当然,如果事情不匹配,那么使用.ConstructUsing(...)
即可。
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>();
}
}
注意:假设您使用Profiles来设置自动映射器映射。
当一个像下面使用,这将产生正确的对象:
var model = new PersonModel
{
Id = 1
Name = "John Smith"
}
// will correctly call the (id, name) constructor of Person
_mapper.Map<Person>(model);
您可以在官方wiki on GitHub
2
最佳实践了解更多关于automapper建设是从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. Grails构造函数 - 设置属性与映射参数
- 2. 将构造函数参数映射到app.config中的设置
- 3. 在映射时向Automapper提供构造函数参数
- 4. 使用类属性而不是const构造函数参数
- 5. 如何建立AutoMapper映射传递参数的目标类的构造函数
- 6. 如何使用AutoMapper在构造函数中映射为“this”
- 7. Automapper映射属性
- 8. 构造函数链和静态属性参数和结构映射
- 9. Javascript - 在构造函数或构造函数的prototype属性中设置属性?
- 10. 重载构造映射构造函数
- 11. 基于构造函数参数属性
- 12. 构造函数参数春季属性
- 13. 如何使用AutoMapper将数组映射到多个属性?
- 14. AutoMapper - 使用构造函数映射子集合
- 15. 映射只有几个属性,而不是所有使用Automapper
- 16. AutoMapper未映射子属性
- 17. Automapper - 映射到Interface类型属性而不创建具体类
- 18. 如何通过构造函数为每个参数使用映射器来构造目标类型?
- 19. 如何限制在构造函数外设置属性?
- 20. 如何在EC6上设置构造函数的静态属性
- 21. 默认的构造函数,而不是参数化的构造函数
- 22. 为什么不是构造函数设置一个参数?
- 23. 如何使Automapper选择无参数构造函数
- 24. 如何正确映射函数构造函数?
- 25. 使用属性注入而不是构造函数注入
- 26. 创建新实例而不是映射属性的自动映射器
- 27. 如何获取传递给属性构造函数的参数?
- 28. 如何自动将.NET函数调用映射到属性?
- 29. 构造函数的属性
- 30. AutoMapper将未映射的属性映射到Dictionary/ExtensionData
我猜“ConstructUsing”必须在一个较新版本的automapper比一个w在使用。感谢Jon – jlembke 2010-02-10 19:33:23
非常感谢这个例子Jon。 “ConstructUsing”非常棒!允许我使用标记为私有的setter来保持我的DTO不可变。 – Daniel 2010-11-08 00:46:59
为我工作, AutoMapper目前不喜欢所有参数都是可选的构造函数,所以我只是使用.ConstructUsing(x => new MyClass()); – 2011-04-11 23:56:12