문제

대상 세터가 비공개 인 경우 대상 객체의 생성자를 사용하여 객체에 매핑 할 수 있습니다. automapper를 사용하여 어떻게해야합니까?

도움이 되었습니까?

해결책

사용 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; }
    }
}

다른 팁

당신은 사용해야합니다 Map 대상을 설정할 수있는 메소드. 예를 들어 :

Mapper.CreateMap<ObjectFrom, ObjectTo>()

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

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

모범 사례는 Automapper의 문서화 된 접근 방식을 사용하는 것입니다.http://docs.automapper.org/en/stable/construction.html

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)));

이 답변을 작성할 때 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<PersonViewModel, Person>();
    }
}

참고 : 이것은 당신이 사용하고 있다고 가정합니다 프로필 Automapper Mappings를 설정합니다.

아래와 같이 사용하면 올바른 개체가 생성됩니다.

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

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

오프전의 Automapper Construction에 대한 자세한 내용을 읽을 수 있습니다. Github의 위키

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top