2017-11-22 4 views
0

AutoMapper를 사용하여 동일한 유형의 두 객체를 병합하고 null 또는 false 인 경우 필드를 덮어 쓰려고합니다. 같은같은 유형의 오토 맵퍼 매핑 객체

public class TestModel 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    public bool C { get; set; } 
    public bool D { get; set; } 
} 

그리고 설정 두 가지 모델 : 예를 들어, 나는 다음과 같은 모델이 있다고

var model1 = new TestModel 
{ 
    A = "a", 
    B = "b", 
    C = true, 
    D = false 
} 

var model1 = new TestModel 
{ 
    A = null, 
    B = "b", 
    C = false, 
    D = true 
} 

내가 그렇게 병합 된 모델의 모습을 병합 할을

var mergedModel = new TestModel 
{ 
    A = "a", 
    B = "b", 
    C = true, 
    D = true 
} 

지금까지 매퍼 구성은 다음과 같습니다.

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<TestModel, TestModel>() 
     .ForAllMembers(options => 
     { 
      options.Condition((source, destination, member) => member != null); 
     }); 
}); 

var mergedModel = Mapper.Map(model1, model2); 

하지만 물론 mergedModel.D = false로 끝납니다. 나는 어떤 다른 조건이 필요하므로 거짓 인 bool을 덮어 씁니까?

+1

을하지만, 코드의 가독성 관점에서, 동일한 두 개체를 매핑 AutoMapper를 사용하여 타겟 객체 유형을 추가하는 동시에 일부 부가 가치를 적용하는 비즈니스 로직은 쉽지 않을 것입니다. 정적 사용자 정의 매핑 메소드 인'TestModel DoMyCustomMerge (TestModel, TestModel)'은 더 직관적 일 수 있습니까? (예 : Automapper에서 비즈니스 로직을 숨기면 유지 관리가 까다로울 수 있습니다.) – StuartLC

+0

이것은 AutoMapper에 대한 몇 가지 정말 이상한 사용 사례이며, 병합 메소드 또는 유사 클래스 자체의 로직을 캡슐화합니다. –

답변

1

매핑에 대한 일부 논리를 구현하는 경우 각 멤버에서 명시 적으로 더 잘 수행하십시오.

하지만 당신이 정말로 AutoMapper 마법을 통해 작업을 수행하려는 경우, 당신은이 조건을 추가 할 수 있습니다 질문에 대답하지 동안

options.Condition((source, destination, member) => (member as bool?) != false); 
관련 문제