2016-07-05 2 views
3

AutoMapper로 설정 한 프로젝트에서 작업 중입니다. 이것의 대부분이 내게 외국적이기 때문에, 나는 왜 그런지에 대해 열린 마음을 지키고있다.Mapper vs Constructor

class Foo 
{ 
    public string name { get; set; } 
    public int rank { get; set; } 
    public bool isDelected { get; set; } 
} 

class FooView 
{ 
    public string name { get; set; } 
    public int rank { get; set; } 
} 

가 대신 ORM을 사용하는 이유를 난 그냥 매개 변수로 FooView를 사용하는 생성자를 사용하지 것이다 :

의 나는 두 개의 클래스가 있다고 가정 해 봅시다. 나는 FooView이 나는 푸 필요할 때마다이 경우

class Foo 
{ 
    public Foo(FooView source) 
    { 
     this.name = source.name; 
     this.rank = source.rank; 
    } 
} 

난 그냥 그것은 나에게 내가 한 위치에 필요한 모든 논리를주고 내가 어디에서나 사용할 수 있습니다
var myFoo = new Foo(FooView); 

을 말한다. 코드를 업데이트해야하는 경우 모델 정의와 동일한 위치에 있습니다. 그래서 나는 무엇을 놓치고 있습니까?

+1

에서 분리를 내 매핑 로직을 유지하는 데 도움이,하지만 당신은 20, 30 또는 그 이상의 특성이 있다면? Automapper는 이름이 일치하면 자동으로이를 매핑합니다. 이것만으로도 모든 구성 오버 헤드가 있습니다. –

+1

[Automapper] (http://automapper.org/)의 장점을 읽은 다음 사용하고 싶다면 스스로 결정해야합니다. automapper의 이점 중 하나는 (* 이보다 훨씬 많은 기능이 있습니다.) 속성이 동일한 서명 (둘 다 public setter/getter가 있어야 함) 인 경우 두 객체에 걸쳐 값을 자동으로 매핑 할 수 있다는 것입니다. 이것은 같은 유형 (복제품과 같음)이거나 다른 유형일 수 있습니다. 특히 비즈니스/데이터 로직 모델과 매우 유사한 많은 뷰 모델이있는 경우 많은 코드를 절약 할 수 있습니다. – Igor

+1

@MattyM이 생각하기에 이것은 큰 개선이 테스트 능력과 일관성이라고 지적했다. AutoMapper 문서의 첫 번째 요점 중 하나는 왜 사용하는지 설명합니다. –

답변

1

모든 모델이 같은 어셈블리에 있거나 다른 항목에 직접 종속되어있는 경우이 방법이 유용 할 수 있습니다. AutoMapper는 모델이 멋지게 정렬되면 좋지만 맵핑을 좀 더 제어해야하는 경우이를 전용 헬퍼 또는 MVC 컨트롤러 내에서 정적 매핑 방법에 적용하는 경향이 있습니다.

이 당신은이 작업을 수행 할 수있는 모델

private static Foo MapToFoo(FooView vm) 
{ 
    var foo = new Foo(); 
    foo.Name = vm.Name; 
    foo.Rank = vm.Rank; 
    ... 
    return foo; 
}