2011-12-02 2 views
13

AutoMapper를 사용하여 개인 설정 도구에 속성을 할당 할 수 있습니까? 이개인 설정 도구를 사용하는 AutoMapper 매핑 속성

public class RestrictedName 
{ 
    public RestrictedName(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 
} 

public class OpenName 
{ 
    public string Name { get; set; } 
} 

같은 생성자에서이 속성에 대한 값을 설정하면

+0

사용하는 Automapper의 버전은 무엇? 그 일을 해봤습니까? – PatrickSteele

+8

@blockhead 사실 그것은 매우 중요한 질문입니다. 불변의 객체는 자유롭게 변경할 수있는 객체보다 훨씬 더 나은 아키텍처입니다 (자신의 세터를 공개적으로 노출시킴으로써). 이것은 Entity Framework가 최근 사유 재산으로 수화하여 도메인 모델이 초기 수화 후에 불변으로 유지 될 수 있도록하는 기능을 추가 한 정확한 이유입니다. 아마도 자신의 건축물을 닦을 필요가있는 것은 레오 실라가 아닙니다. ;) – Marchy

+0

실례 합니다만? 사유 재산은 사적이어야합니다. 그것은 객체에 속한 데이터이고, 객체 만 알고 있고 그 데이터에 대해 알아야합니다. – blockhead

답변

15

다음이 코드

var openName = new OpenName {Name = "a"}; 
var restrictedName = Mapper.Map<OpenName, RestrictedName>(openName); 
Assert.AreEqual(openName.Name, restrictedName.Name); 
+2

최신 버전에는 필요하지 않은 것 같습니다. 프라이빗 세터가있는 수업을지도 할 수 있습니다. 내부적으로 리플렉션을 사용해야합니다. – Monstieur

+0

@ Locutus 어쩌면 그 주석을 대답으로 바꿀 수 있습니까? 아마도이 질문에 대한 새로운 대답으로 표시되어야합니다. – julealgon

9

작동이

Mapper.CreateMap<OpenName, RestrictedName>() 
      .ConstructUsing(s => new RestrictedName(s.Name)); 

같은 ConstructUsing을 사용할 수 있습니다 AutoMapper를 사용하면 개인 설정자와 속성을 매핑 할 수 있습니다. 그것은 리플렉션을 사용하여 객체를 생성합니다.

예 클래스 :

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 


public class PersonDto 
{ 
    public string Fullname { get; private set; } 
} 

및 매핑 :

AutoMapper.Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)); 

var p = new Person() 
{ 
    Name = "John", 
    Surname = "Doe" 
}; 

var pDto = AutoMapper.Mapper.Map<PersonDto>(p); 

AutoMapper가 문제없이 개인 세터와 속성을 매핑합니다. 강제 캡슐화하려면 IgnoreAllPropertiesWithAnInaccessibleSetter를 사용해야합니다. 이 옵션을 사용하면 모든 개인 속성 (및 기타 액세스 할 수없는)이 무시됩니다.

AutoMapper.Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)) 
    .IgnoreAllPropertiesWithAnInaccessibleSetter(); 

Silverlight를 사용하면 문제가 발생합니다. MSDN에 따르면 https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx

In Silverlight, you cannot use reflection to access private types and members. 
3

#600 Private/internal destination properties를 참조하십시오.

솔루션 :

public class PrivateInternalProfile { 
    protected override Configure() { 
     ShouldMapField = fieldInfo => true; 
     ShouldMapProperty = propertyInfo => true; 
     CreateMap<User, UserDto>(); //etc 
    } 
} 
관련 문제