2010-04-08 6 views
3

제가 이해 하듯이, 도메인 모델은 데이터 (집계 루트) 만 설명하는 클래스입니다. 이들은 POCO이며 외부 라이브러리를 언급하지 않습니다 (특별한 것은 없음).ASP.NET MVC : ViewModel 객체를 반환하는 메카닉은 무엇입니까?

반면 모델보기는 SelectList과 같은 모든 인터페이스 관련 개체는 물론 도메인 모델 개체를 포함하는 클래스입니다. ViewModel에는 using System.Web.Mvc;이 포함됩니다.

리포지토리는 데이터베이스에서 데이터를 가져와 도메인 모델 개체를 통해 피드를 제공합니다. 데이터베이스에서 뷰 모델 객체를 생성하는 기계공이나 장치는 무엇입니까? 데이터베이스 액세스 권한이있는 팩토리일까요? Repository에 System.Web.Mvc와 같은보기 특정 클래스를 피 흘리게 하시겠습니까? 다른 것? 당신이 도시의 드롭 다운 목록을 경우

예를 들어, 당신은 당신의 DomainModel 참조 바로 옆에, 당신의보기 모델 객체의 루트에 selectList의 객체를 참조 할 것 :

public class CustomerForm { 
    public CustomerAddress address {get;set;} 
    public SelectList cities {get;set;} 
} 

성읍이 와야한다 데이터베이스에서 선택 목록 오브젝트의 양식으로되어 있어야합니다. 특별한 도시를 추출하기 위해 특별한 Repository 메소드를 생성하지 말고, 여분의 두 번째 SelectList 객체 만 생성하면 올바른 데이터 유형을 가질 수 있기를 바랍니다.

답변

2

AutoMapper은 모델을보기 모델로 변환하는 데 사용할 수 있습니다. 여기에 ASP.NET MVC 애플리케이션에서 사용할 수있는 방법에 관한 nice article이 있습니다.

기본적으로 컨트롤러의 동작은 다음과 같습니다

[AutoMap(typeof(ProductModel), typeof(ProductViewModel))] 
public ActionResult Index(int id) 
{ 
    return View(_repository.GetById(id)); 
} 

그래서 당신은 여전히 ​​컨트롤러에서 도메인 모델 일을하고 AutoMapper를 사용합니다 AutoMap 액션 필터에 따라 뷰 - 모델에 모델을 변환 맵핑 파일을 작성하여보기에 전달하십시오.

+0

드롭 다운 목록을 채우는 것과 같은 추가 데이터를 처리 할 때이 데이터를 저장소에서 가져 오나요? "도시 목록"과 같은 "마이크로"도메인 모델을 처리하기 위해 특수 도메인 모델을 만드십니까? 아니면 db 액세스 권한이있는 Factory와 같은 다른 패턴이 있습니까? –

+1

스티브 미첼로 티 (Steve Michelotti)가 작성한 위대한 글을 읽었습니다. http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx –

3

도메인 객체에서 뷰 모델을 채우는 것이 컨트롤러의 책임이라고 말할 수 있습니다. 컨트롤러 "Get"동작은 리포지토리에서 도메인 개체를 검색하고, 뷰 모델을 만들고, 뷰 모델을 채운 다음 뷰에 전달합니다.

+0

일 - 컨트롤러는 올바른 데이터 모델과 뷰는 다음을 변환하기 위해 컨트롤러에 코드를 생성, 그래서 당신은 목록 옵션 드롭 다운 추출 저장소 방법을 만들 –

+0

(뷰 모델)에 바인딩 "제시" ViewModel에? 컨트롤러의 코드를 별도의 메소드로 리팩터링하여 책임 수를 줄이면 일부 정비사가 모든 것을 수용하는 대신 컨트롤러 공간의 어딘가에 여러 가지 메소드를 사용하게 될 것입니다. 이러한 ViewModel을 채우기 위해 데이터베이스에 어떻게 액세스합니까? 각각의 DDL에 대해 하나의 리포지토리 (Repository) 메소드를 가지고 있으며,이 마이크로 도메인 객체를 반환하는 리포지토리 메소드가 많이 있습니까? –

+0

컨트롤러 공간에서이 기능을 사용하는 것이 적절합니다. 유사한 드롭 다운 목록이 많은 경우 리팩터링하여 단일 리포지토리로 결합 할 수있는 기회가있을 수 있습니다. 그런 다음 뷰 모델을 만들 때 팩터 리나 일종의 매퍼를 사용하여 코드를 그룹화 할 수 있습니다. 도메인 개체를보기 모델로 변환하는 것은 확실히 MVC 응용 프로그램의 과제 중 하나입니다. 나는 매퍼 클래스를 함께 그룹화하는 것이 도움이된다는 것을 발견했다. – Mac

4

CQRS (Command Query Responsibility Segregation)를 살펴 보시기 바랍니다. 이 패턴을 기반으로, 당신은 실제로 당신의 모델을 Repository에서 가져 와서 ViewModel에 매핑 할 필요가 없습니다.

데이터 검색 (쿼리) 및보기에 표시하기 위해 별도의 클래스 집합을 사용할 수 있습니다. 당신은이 클래스 제공자들 또는 당신이 원하는 무엇이든 호출 할 수 있습니다. 이러한 클래스는 ViewModel 또는 제네릭 DataSet/DataTable 개체를 반환 할 수 있습니다. 이 접근법에는 2 가지 이점이 있습니다.

1- Model과 ViewModel 간의 매핑에 대해 걱정할 필요가 없으므로 코딩과 유지 관리가 더 쉽습니다. 2 모델이 가지고있는 속성이 사용자가 화면에서 볼 것을 기대하는 바가 아닙니다. 일부 개발자는 디스플레이 목적으로 모델에 새로운 속성을 추가하기 때문에 모델이 장기적으로 현실을 잃게됩니다. 모델에 종속되지 않고 ViewModel 또는 DataSet/DataTable을 공급자에서 직접 반환하면 모델과 ViewModel을 개별적으로 발전시킬 수 있습니다.

MOSH

관련 문제