2014-01-20 2 views
1

여기에 ViewModels에 대해 오해 할 수도 있지만 정적 인 Get 메서드를 IQueryable으로 전달하는 것은 나쁜 습관입니까? 나는 이것을 시도하지 않았기 때문에 작동하는지 확실하지 않지만 ViewModels의 사용법에 관해서는 더 큰 질문입니다. 예를 들어ViewModel에 IQueryable을 전달하는 나쁜 습관

: -> 목록

using (var db = something.Invoke()) { 
    var query = some query; 
    var data = MyViewModel.Get(query); //pass an IQueryable 

    //do something with data 
} 

class MyViewModel { 
    public List<int> Something {get; set;} 

    public static MyViewModel Get(IQueryable data) { 
     var view = new MyViewModel(); 
     var list = new List<int>(); 
     foreach (var d in data) { 
      list.Add(d.Column); 
     } 
     view.Something = list; 
     return view; 
    } 
} 

그것은 단지 더 일반적인 데이터 구조 내 데이터베이스를지도하고 (데이터베이스와 같은 또 다른 매핑을 내 뷰 모델에 그것을 통과해야 정말 중복 것 같다 - > ViewModel). 내 쿼리를 전달하고 매핑 중 100 %가 ViewModel에서 발생하도록하는 것이 더 쉬울 것입니다. 대신에 inbetween 단계 (데이터베이스 -> ViewModel)가 필요합니다.

+1

안녕하세요. 나는 실제로이 옵션을 고려하기 시작했다. 정말 비슷한 뷰 모델을 반복해서 만들어야하는 것은 너무 번거롭고 - EF가 IQueryable 옵션을 가지고 있기 때문에 뷰 모델 생성자가 스스로를 만들도록하는 것이 거의 타당합니다. 그것은 결국 "생성자"가 무엇인지에 대한 것입니다 ... SRPrinciple을 실제로 위반하는 것인가 궁금합니다. – Worthy7

답변

3

우리는 ViewModels에서 로직을 사용해 보았지만 이것이 광기의 길입니다.

ViewModels은 POCO 전용 속성이 아니야 (또는 매우 기본적인) 논리 여야합니다. 모든 매핑은 컨트롤러에서 수행해야하며 컨트롤러가 호출하는 QueryHanlder에서도 수행해야합니다. 그리고 QueryHanlder은 DB에 의존하고 DB 데이터 구조에서 ViewModel로 가져 오기 위해 필요한 매핑을 수행합니다.

ViewModel의 책임은 컨트롤러에서보기 (또는 뒤로)로 데이터를 전달하는 것입니다. DB 또는 매핑 논리를 가져 오면 이는 Single Responsibility Principle의 위반입니다.

1

내가 만든 ViewModel을 공정하고 청결하게 유지하는 방법을 선호합니다.

이 경우 필자는 ViewModel을 구성하기 위해 빌더 또는 팩토리 패턴을 사용하고 해당 빌더/팩토리가 데이터베이스에 대한 종속성을 가질 수 있습니다.

관련 문제