如果我的目標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. 如何使用AutoMapper在構造函數中映射爲「this」
- 3. 構造函數鏈和靜態屬性參數和結構映射
- 4. 如何使用AutoMapper將數組映射到多個屬性?
- 5. AutoMapper - 使用構造函數映射子集合
- 6. 映射只有幾個屬性,而不是所有使用Automapper
- 7. AutoMapper未映射子屬性
- 8. Automapper - 映射到Interface類型屬性而不創建具體類
- 9. 如何通過構造函數爲每個參數使用映射器來構造目標類型?
- 10. 如何在EC6上設置構造函數的靜態屬性
- 11. 爲什麼不是構造函數設置一個參數?
- 12. 如何使Automapper選擇無參數構造函數
- 13. 使用屬性注入而不是構造函數注入
- 14. 如何獲取傳遞給屬性構造函數的參數?
- 15. STL映射值構造函數
- 16. Spring MimeMessageHelper構造函數映射?
- 17. AutoMapper將未映射的屬性映射到Dictionary/ExtensionData
- 18. Automapper不調用構造函數
- 19. 我如何調用char構造函數而不是char []構造函數
- 20. Spring在使用無參數構造函數時確保已設置Bean屬性
- 21. Angular - 在構造函數中設置屬性時無法解析所有參數
- 22. 如何在AutoMapper映射中忽略屬性的屬性?
- 23. 如何設置參數化構造函數值
- 24. 屬性類不調用構造函數
- 25. 編譯器啓動默認構造函數而不是帶參數的構造函數C++
- 26. 讓QueryDSL的構造函數使用常量而不是參數
- 27. 如何在結構體的構造函數中設置自動屬性?
- 28. 使用AutoMapper的問題將DAL屬性映射到BLL屬性
- 29. 將URI參數映射到參數對象的屬性?
- 30. 在構造函數中設置默認函數參數
我猜「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