2010-01-07 2 views
5

지금은 꽤 심하게 구식 뷰 모델을 얻었습니다.여러 집계 루트가있는 뷰 모델을 처리하는 방법은 무엇입니까?

클래스는 리더 유형이 도메인 모델 (SRP 위반)에서 유래입니다이 =>

public class AccountActionsForm 
    { 
     public Reader Reader { get; set; } 
     //something... 
    } 

문제처럼 보인다.

기본적으로 디자인 팁을 찾고 있습니다 (뷰 모델을 입력/출력으로 나누는 것이 좋습니다) 마찰이 적고 개발자 친화적 인 뷰 모델을 만드는 방법 (예 : 매핑은 자동으로 컨트롤러 기본 클래스)?

저는 AutoMapper 프레임 워크를 알고 있으며 아마도 그것을 사용할 것입니다.

다시 한번, 올바른 뷰 모델을 만들 때 공통점이있는 것은 무엇입니까? 그것을 구조화하는 방법? 다중 도메인 객체 입력이 필요할 때 어떻게 매핑합니까?


보기에 둘 이상의 집계 루트의 데이터가 필요한 경우에 혼동이됩니다.

내 경우에는 - 도메인 수준에서 LibraryReaderThatHasOrderedSomeBooks 또는 그 외의 것으로 그룹화하는 것은 의미가 없지만 약 목록을 표시해야합니다. 특정 도서관의 특정 독자를위한 주문 도서는 모두 필요합니다.

그래서 - 즉 LibraryOutput, ReaderOutputBibliographicRecordOutput보기 모델을 보유하고 아래 OrderedBooksListModel보기 모델보기 OrderedBooksList을 만들 좋은 것 같다. 또는 더 나은 - flattening technique을 활용하고 ReaderFirstName 같은 소품을 가지고 OrderedBooksListModel보기 모델, LibraryName

하지만 더 이상의 입력이 있기 때문에 그 매핑 문제로 이어집니다.
하나의 집계 루트에서만 더 이상 1 : 1 관계가 아닙니다.
내 도메인 모델이 잘못 되었습니까?

순전히 UI 레이어 (즉 선택된 탭을 나타내는 열거 형)에있는보기 모델 필드는 어떻게됩니까?

this 누구나 그런 경우에 무엇을합니까?

FooBarViewData fbvd = new FooBarViewData(); 
    fbvd.Foo = new Foo(){ A = "aaa"}; 
    fbvd.Bar = new Bar(){ B = "bbb"}; 
    return View(fbvd); 

나는이 =>

var fbvd = new FooBarViewData(); 
    fbvd.FooOutput = _mapper.Map<Foo,FooOutput>(new Foo(){ A = "aaa"}); 
    fbvd.BarOutput = _mapper.Map<Bar,BarOutput>(new Bar(){ B = "bbb"}); 
    return View(fbvd); 

쓰기의 많은 것 같다 기꺼이 아니에요. :)


Reading this 현재 및 this.


확인.나는이 문제에 대해 많은 생각을하고 그래 - 또 다른 추상화 레이어를 추가하는 것은 그래서

alt text http://i46.tinypic.com/fe14qp.jpg

=>

해결책처럼 보인다 -이 이미 작동 내 마음에, 지금은 일부 놀겠위한 시간이다.

타이 지미

답변

3

이 모든 것을 정의하기는 어렵지만 여기에 설명되어 있습니다. 우리는 View가 Controller가 구축 한 것과 무엇을 구분 하는지를 구분하고자합니다. 보기는 평평하고 뇌가 죽은 DTO와 같은 대상을 봅니다. 이것을 View Model이라고 부릅니다.

컨트롤러 쪽에서는 뷰 모델을 작성하는 데 필요한 풍부한 그래프를 작성합니다. 이것은 단지 하나의 집계 루트이거나 여러 집계 루트의 조합 일 수 있습니다. 이 모든 것들은 우리가 프레젠테이션 모델이라고 부르는 것으로 합쳐집니다. 때때로 프레젠테이션 모델은 단지 지속성 (도메인) 모델 일 뿐이지 만 때로는 새로운 개체입니다. 그러나 실제로 우리가 발견 한 것은 복합 프리젠 테이션 모델을 만들어야하는 경우 관련 프리젠 테이션 모델이 관련 동작을위한 자석이되는 경향이 있다는 것입니다.

예제에서는 ViewFooBarModel 및 ViewFooBarViewModel (또는 ViewFooBarModelDto)을 만듭니다.내 컨트롤러에서 ViewFooBarModel에 대해 이야기 한 다음 매핑을 사용하여 AutoMapper로이 중간 모델에서 필요한 것을 평평하게 만들 수 있습니다.

+0

당신이 알아야 할이 생각에 대답하는 것을보기를 원했습니다 (http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/01/04/ui-automation-tools-snake-oil.aspx). 이 질문에 대한 답변은 내 실제 목표가 무엇인지에 대한 훌륭한 & 안정적인 UI 테스트 (및 Mvc2 템플릿 버즈 준비)의 성공적인 개발을위한 또 다른 벽돌입니다. 나는 집에 돌아갈 때마다 약간의 전체적인 아이디어를 요약하려고 노력할 것이다. 당신의 대답 아래에 다른 "핑 (ping)"코멘트를 붙여 응답을 얻는다. :) –

4

여기에 우리가 오랜 시간에 대한 대안으로 어려움을 겪고 된 후 우리 떠올랐다 하나 개의 항목입니다 : 렌더링 데이터가 데이터을받는 다른가.

우리는 ViewModels를 사용하여 데이터를 렌더링하지만 양식 게시 등을 통해 데이터를 수신하면 ViewModel을 ModelBinding 개념에 실제로 적용 할 수 없었습니다. 주된 이유는 브라우저 왕복으로 데이터가 손실되는 경우가 많기 때문입니다.

예를 들어 ViewModels를 사용하더라도 실제 도메인 개체의 데이터를 기반으로하지만 도메인 개체의 모든 데이터가 노출되지 않을 수 있습니다. 이것은 브라우저가 게시 한 데이터에서 기본 도메인 객체를 즉시 재구성 할 수 없음을 의미합니다.

대신 게시자가 게시 된 데이터에서 전체 도메인 객체를 검색하기 위해 매퍼와 리포지토리를 사용해야합니다. 우리가 이것을 실현하기 전에

, 우리는 게시 된 데이터에서 전체 도메인 개체 또는 뷰 모델을 재구성 할 수있는 사용자 정의 ModelBinders을 구현하는 시도로 많은 고생, 그러나 지금 우리는 별도의 PostModels 우리가 데이터를 수신하는 방법을 그 모델을 가지고있다.

추상적 인 맵퍼와 서비스를 사용하여 PostModel을 도메인 객체에 매핑합니다. 필요한 경우 ViewModel로 돌아갈 수 있습니다.

+0

이것은 좋은 팁이지만 불행히도 (또는 운좋게도)이 부분을 알아 냈습니다. Id/매핑에 의한 모델 바인딩은 매력처럼 작동합니다. 또 다른 한가지는보기 모델을 렌더링 한보기 모델로 분리하고 양식을 게시 할 때받은 모델을 보는 것이 좋습니다. –

+0

보기가 하나 이상의 엔티티 뷰 모델을 필요로하고 그룹화해야하는 경우를 처리하는 방법에 관심이 있습니다. 그것에 관한 어떤 조언? –

+0

추가 질문을 이해할 수 있는지 모르겠지만 다른 ViewModels에서 ViewModels을 작성할 수 있습니다. 그러나, 당신은 똑똑한 녀석이에요, 그래서 당신은 아마 이미 알고, 그래서 당신이 뭔가 다른 것 같아요. –

3

관련없는 엔티티 (또는 해당 리포지토리)를 도메인 개체 또는 서비스로 그룹화하는 것이 의미가 없지만 프레젠테이션 계층에서 그룹화하는 것이 좋습니다.

특정 응용 프로그램에 특히 적합한 방식으로 도메인 데이터를 나타내는 사용자 지정 ViewModel을 빌드하는 것처럼 필요에 따라 여러 가지를 결합하는 사용자 지정 프레젠테이션 계층 서비스도 사용합니다. 이러한 서비스는 특정보기를 지원하기 위해 존재하기 때문에 훨씬 더 특별합니다.

종종 우리는 인터페이스 뒤에이 서비스를 숨겨서 원하는 결과를 구성하는 데 관련이없는 삽입 된 도메인 객체를 자유롭게 사용할 수 있습니다.

+0

나에게도 의미가있다. 기술적 관점에서 실제 구현에 대해 궁금한 점이 있습니다. 엔티티를 집계하고 좀 더 복잡한 뷰 모델을 생성하기 위해 무수한 생성자를 만들지 않을 것입니다. 자동 완성 장치가 이것에 약간의 도움을 줄 수 있습니까? –

+0

나는 우리 물건을 어떤면에서는 복잡하지 않은 것으로 축소시킬 수 없었습니다. 전반적인 데이터 손실이 없기 때문에 리치 클라이언트에서 훨씬 간단합니다. AutoMapper가 많은 도움을주는 것을 보지 못했습니다. 왜냐하면 그 힘은 대회 - 기반 매핑에 있기 때문입니다. 어쩌면 당신은 새로운 질문 으로이 특정 질문을 물어야하고, 나는 대답하지 않을 것을 약속한다 : –

+0

생각은 마음에 왔어 => 행동은 MapTo (typeof (OrderedBooksListModel))로 꾸며질 수 있고 anon 유형 'View ("OrderedBooksList", 새로운 {라이브러리, 독자, 서지 레코드 []})'필터를 통해 반사 마술과 자동 매핑을 사용하여 제대로 매핑합니다. 그게 수용 가능한 해결책일까요? 어떤 단점이 있니? –

관련 문제