W przypadkach, w których moje setery docelowy są prywatne, mogę chcieć odwzorować obiekt za pomocą konstruktora obiektu docelowego. Jak zrobiłbyś to używając Automapper?Automapper - jak mapować do parametrów konstruktora zamiast ustawiaczy właściwości
Odpowiedz
Zastosowanie ConstructUsing
ten pozwoli Ci określić, które konstruktor używać podczas mapowania. ale wtedy wszystkie inne właściwości będą automatycznie mapowane zgodnie z konwencjami.
Należy również zauważyć, że różni się on od ConvertUsing
tym, że konwersja przy użyciu nie będzie kontynuowała mapowania za pośrednictwem konwencji, zamiast tego zapewni pełną kontrolę nad mapowaniem.
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; }
}
}
należy użyć metody Map
który pozwala ustawić miejsce docelowe. Na przykład:
Mapper.CreateMap<ObjectFrom, ObjectTo>()
var from = new ObjectFrom { Name = "Jon", Age = 25 };
var to = Mapper.Map(from, new ObjectTo(param1));
W momencie pisania tego odpowiedź, AutoMapper zrobi to automatycznie (za pomocą prostego CreateMap<>()
rozmowy) dla ciebie, jeśli właściwości dopasować parametry konstruktora. Oczywiście, jeśli coś nie pasuje, to do zrobienia jest użycie .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>();
}
}
Uwaga: Zakładamy używasz Profiles do konfiguracji mapowania automapper.
Kiedy używany jak poniżej, to wytwarza poprawny obiekt:
var model = new PersonModel
{
Id = 1
Name = "John Smith"
}
// will correctly call the (id, name) constructor of Person
_mapper.Map<Person>(model);
można przeczytać więcej na temat budowy automapper w oficjalnej wiki on GitHub
Najlepszą praktyką jest stosowanie udokumentowanych podejść z 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. AutoMapper używa niewłaściwego konstruktora
- 2. Korzystanie AutoMapper mapować ciąg do wyliczenia
- 3. Automapper braku mapować na IEnumerable
- 4. Jak mapować złożony obiekt za pomocą Automapper?
- 5. właściwości Testowanie z prywatnymi ustawiaczy
- 6. Jak mapować wiele inputText do właściwości tablicy?
- 7. Jak mogę mapować między dwoma wyliczeniami za pomocą Automapper?
- 8. Automapper V5 Ignoruj właściwości unmapped
- 9. Mijając tablicę parametrów do konstruktora obiektu
- 10. Jak powiązać żądania bez ustawiaczy?
- 11. Jak przekazywać wartości kontekstowe do mapy Automapper?
- 12. WPF: Deklaracje właściwości XAML nie są ustawiane za pomocą ustawiaczy?
- 13. Jak powiedzieć Fluent NHibernate, aby nie mapować właściwości klasy
- 14. AutoMapper MapFrom działa do obliczeń?
- 15. backbone.js - niestandardowe ustawiaczy
- 16. zbiory Mapowanie wykorzystujące AutoMapper
- 17. Automapper: Mapa do chronionej własności
- 18. MEF: Przekazywanie różnych parametrów konstruktora do części przy użyciu CreationPolicy.NonShared
- 19. Wprowadzanie parametrów do konstruktora za pomocą adnotacji na wiosnę
- 20. Klasa podstawowa nie zawiera konstruktora bez parametrów?
- 21. Dodaj konstruktora kopii na podstawie parametrów szablonu
- 22. Modyfikowanie wartości parametrów przed wysłaniem do konstruktora bazowego
- 23. Dlaczego nie mogę przekazać parametrów do konstruktora aktywności Androida?
- 24. Castle Windsor IOC: Przekazywanie parametrów konstruktora do komponentów potomnych
- 25. Jak mapować AFIncrementalStore do Twitter API v1.1?
- 26. metoda statyczna, aby utworzyć obiekt zamiast konstruktora
- 27. Mapowanie pogrupowany zbiór używając AutoMapper
- 28. Uzyskiwanie dostępu do właściwości konstruktora bez tworzenia nowej instancji
- 29. Jak debugować kod AutoMapper?
- 30. przekazywania parametrów konstruktora dla MXML opartych na niestandardowych składników Flex
Zgaduję, że "ConstructUsing" musi być w nowszej wersji automappera niż w używamy. Dzięki Jon – jlembke
Dziękuję za ten przykład Jon. "ConstructUsing" jest świetny! Pozwala mi zachować niezmienność moich DTO za pomocą seterów oznaczonych jako prywatne. – Daniel
Działa dla mnie; AutoMapper obecnie nie lubi konstruktorów, w których wszystkie parametry są opcjonalne, więc po prostu używam .ConstructUsing (x => new MyClass()); –