2010-02-15 6 views
2

뷰 모델을 사용하여 ASP.NET MVC 프로젝트에서 액션 메소드를 정리하려고합니다. 현재 내보기 모델에는 다른 항목과 관계가있는 항목이 포함되어 있습니다. 예를 들어, ContactViewModel 클래스에는 Address가있을 수있는 Contact가있을 수 있습니다. 둘 다 별도의 엔티티입니다. 연락처 개체 목록을 쿼리하려면 다음과 같은 작업을 수행 할 수 있습니다.ASP. NET MVC : 엔티티를 모델보기로 매핑

IList<Contact> contacts; 

using (IContactRepository repository = new ContactRepository()) 
{ 
    contacts = repository.Fetch().ToList(); 
} 

EditContactViewModel vm = new EditContactViewModel(contacts); 

return View(vm);

이 방법은 몇 가지 문제를 유발합니다. 예를 들어 저장소는 using 문에서 쿼리됩니다. 뷰가 렌더링 될 때까지 컨텍스트가 범위를 벗어 났으므로 뷰가 컨택과 연관된 Address를 쿼리 할 수 ​​없게됩니다. 열정적 인로드를 가능하게 할 수는 있지만 오히려하지 않을 것입니다. 또한, 엔티티 모델이 내 의견에 피를 흘리게 된 것을 좋아하지 않습니다 (연락처와 주소 간의 관계에 대한 지식이 있지만 내 생각에 동의하지 않는 것이 좋다고 생각합니다).

연락처 및 주소 엔터티의 속성이 포함 된 fattened 클래스를 만드는 것이 좋습니다. 그런 다음 연락처 및 주소 엔티티를 새롭고 평평한 객체로 투영 할 수 있습니다. 이 접근법에 대한 나의 관심사 중 하나는 내 작업 방법이 약간 바쁠 수 있고 내가하지 않는다는 것입니다. AutoMapper는 두 개 이상의 개체를 단일 유형으로 매핑 할 수 있다고 생각합니다.

내 관심사를 극복하기 위해 어떤 기술이 선호됩니까?

답변

3

자동 대행사가 귀하의 케이스에서 작동합니다. 당신이 가지고있는 것은 객체 그래프입니다. Automapper가 잘 처리하는 것들이 있습니다.

+0

매우 좋습니다. 나는 AutoMapper에 아직 익숙하지 않아서지도를 만들 수 있다는 것을 인식하지 못했습니다. 고맙습니다. – senfo

1

... 순서로 이러한 우려를 촬영

첫째, 당신이 사용하는 문 및 저장소 (이 LINQ - 투 - SQL 또는 LINQ - 투 - 엔티티의 경우 나도 몰라 걱정하는 경우, 하지만 그건 중요하지 않습니다), 당신이 할 컨트롤러에 IDisposable 구현 및 모델 또는 컨트롤러 또는보기에서 액세스 할 수있는 어딘가에 필드에 저장소를 저장하는 것이 좋습니다 것이다 (if 객체가 "살아있다"는 동안 모델에 그것에 대한 지식이 있다면 컨트롤러의 수명 동안 유지해야합니다.

그런 다음 요청이 완료되면 컨트롤러의 Dispose 메서드가 호출되고 거기에서 리포지토리를 삭제할 수 있습니다. 개인적으로

, 나는 다음과 같습니다 내 기본 컨트롤러 클래스의 메소드가 : 기본적으로

protected T AddDisposable<T>(T disposable) where T : class, IDisposable 
{ 
    // Error checking. 
    if (disposable == null) throw new ArgumentNullException("disposable"); 

    // Add to list 
    ... 
} 

을, 당신은으로 IDisposable 구현을 저장할 수 있습니다, 다음 컨트롤러는 IDisposable 구현, 그것은을 반복 목록, 모든 것을 버리는 것.

엔티티 모델의 주소 노출에 관해서는 개인적으로 출혈 문제로 보지 않습니다. 이 주소는 연락처 (IMO)의 구성 요소 중 일부이므로 이 아니고이 아닐 수 있습니다. 그러나

, 당신이 그것을 원하지 않는 경우에 당신이 한 번에 하나의 컨트롤러에 한 가지 유형에 초점을 원하기 때문에 나는 등, 등이를 위해

, 당신이 원하는 것, 거기에 동의하지 않습니다 기본적으로 뷰 모델에서 노출하는 유형과 엔티티 모델간에 매핑되는 데이터 전송 객체를 만듭니다.

관련 문제